FFMPEG和DXVA2

时间:2016-01-11 10:40:30

标签: c++ qt ffmpeg hardware-acceleration dxva

我用FFMPEG为IP摄像机(全高清H264)做了一个播放器 我使用Qt在Windows下编码。我需要尽可能低的延迟,我能得到的最好结果是:

  • 我收到了live555的数据包,
  • 使用ffmpeg解码
  • 使用SDL显示它。

但是"慢" CPU如果比特率太高或者它无法处理1080p,我会有很多延迟。

我真的想尝试使用DXVA2进行硬件加速,看看能否获得更好的性能,尤其是在最慢的CPU中。

但我真的不知道如何继续。我必须用--enable-dxva2和--enable-hwaccel = h264_dxva2构建FFMPEG吗?或Zeranoe建造 我从来没有使用Direct X,我是否需要Direct X知识,或者ffmpeg使用--enable-dxva2和--enable-hwaccel = h264_dxva2关注一切?

谢谢

编辑:

您好,我使用这篇文章帮助我使用FFMPEG进行硬件加速 Failed to execute: 0x80070057, when decoding video via ffmpeg with dxva2

我用

解码数据包
avcodec_decode_video2(pCodecCtx, pFrame, &gotPic, &packet);

我正在使用

获取解码后的帧
dxva2_retrieve_data_call(pCodecCtx, pFrame, &gotPic, &packet);

我试图转换它

sws_scale(img_convert_affic, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

并将缓冲区复制到Qimage

LastFrame=QImage(w,h,QImage::Format_RGB888);
for(int y=0;y<h;y++)
    memcpy(LastFrame.scanLine(y),pFrameRGB->data[0]+y*pFrameRGB->linesize[0],w*3);

我得到了我的照片,但是有大量的人工制品,几秒钟后我在dxva2_retrieve_data_call(pCodecCtx, pFrame, &gotPic, &packet);

中遇到了分段错误

编辑: 问题解决了我在检索之前没有检查是否有照片。 但是我的台式机cmputer(英特尔酷睿i5 650,4GB内存,ATI HD5800)的性能非常差,它消耗了5%的CPU,3倍的内存和大量的损坏帧。 在较新的计算机上它更好,但软解码器更好。 启用hwaccel时,dxva2_retrieve_data_call和sws_swale会消耗大量时间......

有没有办法在Qt中显示NV12图片(没有sws_scale转换),有没有办法优化dxva_retrieve_data_call?

1 个答案:

答案 0 :(得分:0)

如果您想要真正的GPU加速(无需复制),您需要通过IDirect3DDeviceManager9(Directx9)/ IMFDXGIDeviceManager(Directx11)提供DirectX Surface。 QT和FFMPEG不为您提供。您还需要提供DirectX显示机制。