c++ - FFMPEG 和 DXVA2

标签 c++ qt ffmpeg hardware-acceleration dxva

我用 FFMPEG 制作了一个 IP 摄像机播放器(全高清 H264) 我在 Windows 下使用 Qt 进行编码。我需要尽可能低的延迟,并且我可以获得最好的结果:

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

但是如果比特率太高或无法处理 1080p,我会遇到“慢速”CPU 的大量延迟。

我真的很想尝试使用 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);

中遇到了段错误

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

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

最佳答案

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

关于c++ - FFMPEG 和 DXVA2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719449/

相关文章:

c++ - Trac 不会解析谷歌测试 xml 输出文件

c++ - 加载大型文本文件(50,000 多行,~8MB)会导致我的程序停止?

c++ - 如何迭代QAbstractListModel?

qt - 捕获 Qt 修饰键释放

nginx - 是否可以同时提供 hls 和 dash mpeg

c++ - FFmpeg MSVC 编译卡住

c++ - Linux perf 不解析符号

c++ - 所有权应该在 STL 容器调用其值的析构函数之前还是之后结束?

python - QTreeWidget 关闭选择

swift - 如何使用ffmpeg将MOV文件头添加到原始数据写入文件中?