【问题标题】:FFMPEG and DXVA2FFMPEG 和 DXVA2
【发布时间】: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, &amp;gotPic, &amp;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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多