2016-06-22 10 views
1

Windows에서 ffmpeg를 사용하여 하드웨어 가속을 사용하여 H264 스트림을 디코딩하는 방법에 대한 간단한 예제를 검색했지만 찾을 수 없습니다. ffmpeg와 함께 dxva2를 사용해야 하드웨어 가속을 사용할 수 있다는 것을 알고 있습니다.ffmpeg와 함께 DXVA2를 사용하여 프레임을 디코딩하고 프레임을 얻는 방법

CPU에서 ffmpeg로 H264를 디코딩 한 다음 NV12 형식을 RGBA로 변환하고 프레임을 bmp 파일로 저장할 수 있습니다 (post에 제공된 예제 프로젝트 덕분입니다).

나는 dxva2에 대한 도움을 얻을 수있는 다음과 같은 게시물에 제공되는 것을 따랐다 : 나는 성공적으로 dxva2과 디코딩 수 있다고 생각 post

을; 그러나 디코딩 된 프레임을 가져 와서 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; 
    } 
} 

을하고 출력 프레임을 공급 :

[swscaler @ 030c5c20] bad src image pointers

분명히 뭔가 잘못입니다 :이 오류가

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

pFrameYuv->data 그러나 나는 무엇을 모른다.

어떻게 swsw_scale을 사용하여 DXVA2로 디코딩 된 NV12 프레임을 RGBA로 변환 할 수 있습니까?

답변

0

문제가 해결되었습니다.

부적절한 픽셀 형식 유형 때문이었습니다. sws_context을 생성 할 때 다음과 같이 는 I 코덱 컨텍스트의 픽셀 포맷을 사용하고 (어느는 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에서 데이터를 가져 오는 또 다른 방법을 찾아야합니다.