我用 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/