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