【发布时间】:2016-04-15 15:19:58
【问题描述】:
我用 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); 中遇到了分段错误
编辑: 问题解决了,我在检索之前没有检查我是否有图片。 但是我的台式电脑(英特尔酷睿 i5 650、4GB RAM、ATI HD5800)的性能非常差,它消耗的 CPU 多 5%,内存多 3 倍,而且有很多损坏的帧。 在较新的计算机上更好,但软解码器更好。 dxva2_retrieve_data_call 和 sws_swale 在启用 hwaccel 时会消耗大量时间...
有没有办法在Qt中显示NV12图片(没有sws_scale转换),有没有办法优化dxva_retrieve_data_call?
【问题讨论】:
标签: c++ qt ffmpeg hardware-acceleration dxva