2016-06-22 17 views
1

Windowsでffmpegを使用してH264ストリームをハードウェアアクセラレーションでデコードする方法の簡単な例を検索しましたが、何も見つかりませんでした。 ffmpegでdxva2を使用して、ハードウェアアクセラレーションを使用する必要があることは知っています。ffmpegでDXVA2を使用してフレームをデコードして取得する方法

postで提供されているサンプルプロジェクトのおかげで、H264をCPU上でffmpegでデコードし、NV12形式をRGBAに変換してフレームをbmpファイルとして保存できます。

私はdxva2についてのヘルプを表示するには、以下の記事で提供されるものに続いていますpost

私は成功しdxva2でデコードすることができると信じて。しかし、デコードされたフレームを取得してRGBA形式に変換してbmpファイルとして保存したい場合、ソースポインタに関するエラーが発生します。

私は、復号化して、次のようなフレームを取得:

int videoFrameBytes = avcodec_decode_video2(pCodecCtx_hwaccel, pFrameYuv, &got_picture_ptr, avpkt); 

if (got_picture_ptr==1) 
{ 
    if(dxva2_retrieve_data_call(pCodecCtx_hwaccel, pFrameYuv) == 0) 
    { 
     fprintf(stderr, "Got frame successfully\n"); 
     result = true; 
    } 
} 

とに出力フレームを養う:

sws_scale(pImgConvertCtx, pFrameYuv->data, pFrameYuv->linesize, 0, height, frame->data, frame->linesize); 

私はこのエラーを取得する:

[swscaler @ 030c5c20] bad src image pointers

明らかに何かがと間違っていますpFrameYuv->dataしかし、私は何を知りません。

DXVA2でデコードされたNV12フレームをsws_scaleでRGBAに変換するにはどうすればよいですか?

答えて

0

問題を解決しました。

不適切なピクセル形式の種類が原因でした。 sws_contextを作成する場合、以下に示すように、私はコーデックコンテキストのピクセルフォーマットを使用している :(SW復号にOKだった)

// initialize SWS context for software scaling 
sws_ctx = sws_getContext(pCodecCtx->width, 
    pCodecCtx->height, 
    pCodecCtx->pix_fmt, 
    pCodecCtx->width, 
    pCodecCtx->height, 
    AV_PIX_FMT_RGB24, 
    SWS_BILINEAR, 
    NULL, 
    NULL, 
    NULL 
    ); 

そしてpCodecCtx-> pix_fmtはAV_PIX_FMT_YUV420Pたが、フレームフォーマットはDXVA2とAV_PIX_FMT_NV12でデコードされます。正しいフォーマットを設定した後、sws_scaleを使ってNV12フレームをRGBに変換することができました。

右パラメータ:

// initialize SWS context for software scaling 
sws_ctx = sws_getContext(pCodecCtx->width, 
    pCodecCtx->height, 
    AV_PIX_FMT_NV12, 
    pCodecCtx->width, 
    pCodecCtx->height, 
    AV_PIX_FMT_RGB24, 
    SWS_BILINEAR, 
    NULL, 
    NULL, 
    NULL 
    ); 

はまた、次のように出力取得したフレームをUNREFに注意を払う:

av_frame_unref(pFrameYuv); 

は、そうしないと、メモリリークを持っています。

さらに、postに記載されているように、dxva2_retrieve_data_callは非常に非効率的です。 GPUからデータを取得する別の方法を探すべきです。

関連する問題