1

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

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

但是对于“慢” CPU,如果比特率太高或无法处理 1080p,我会有很多延迟。

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

但我真的不知道如何进行。我必须用 --enable-dxva2 和 --enable-hwaccel=h264_dxva2 构建 FFMPEG 吗?或 Zeranoe 构建我从未使用过 Direct X,我是否需要 Direct X 知识,或者带有 --enable-dxva2 和 --enable-hwaccel=h264_dxva2 的 ffmpeg 照顾一切?

谢谢

编辑 :

您好,我使用这篇文章来帮助我使用 FFMPEG 进行硬件加速 无法执行:0x80070057,当使用 dxva2 通过 ffmpeg 解码视频时

我用

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);

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

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

4

1 回答 1

1

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

于 2016-02-05T20:20:58.940 回答