DirectX 与 FFmpeg

DirectX vs FFmpeg

我正在根据以下内容决定如何解码接收到的视频帧:

  1. 平台是 Windows。
  2. 帧以 H264 或 H265 编码。
  3. GPU 尽量用
  4. 当然,我们更喜欢更少的编码和最简单的代码。我们只需要解码并在屏幕上显示结果。不需要录音,不需要其他任何东西。

我还是个新手,但我认为可以直接通过 directx 或通过 ffmpeg 解码帧。我对吗? 如果是这样,哪个是首选?

对于仅使用 GPU 的简单方法和简单代码,请查看我使用 DirectX 的项目:H264Dxva2Decoder

如果您准备好编码,可以使用我的方法。

如果没有,您可以使用 MediaFoundation 或 FFMPEG,两者都可以完成这项工作。

MediaFoundation 是面向 C++ 和 COM 的。 FFMPEG 是面向 C 的。它可以为您带来不同。

编辑

您可以使用我的程序,因为您有以 H264 或 H265 编码的帧。对于 h265,您将需要添加额外的代码。

当然需要修改。是的,您可以在不使用文件的情况下将帧发送到 DirectX。本项目只使用avcc视频文件格式,其他情况可以修改

您不需要原子解析器。例如,如果帧是 annex-b 格式,则需要修改 nalu 解析器。如果帧是 annex-b 格式,您还需要修改缓冲机制。

如果您提供以 H264 编码的帧样本,我可以帮助您。

关于ffmpeg,它比我的程序限制少,根据h264规范, 但不提供渲染机制。例如,您必须混合使用 Ffmepg 和我的渲染机制。

或者研究像 MPC-HC 这样显示混音的程序。我帮不上忙了。

编辑 2

有一件事要知道,您不能将编码数据包直接解码到 GPU。您需要先解析它们。这就是为什么有一个 nalu 解析器(参见 DXVA_PicParams_H264)。

如果您还没有准备好编码和理解它是如何工作的,请使用 Ffmpeg,它实际上会更简单。您可以专注于渲染,而不是解码。

It's also important to know which one gives a better result, consumes less resources (CPU, GPU, RAM (both system memory and graphics card memory), supports wider range of formats, etc.

您要求真正的专业知识...

如果您编写自己的程序,您将能够对其进行优化,并且肯定会获得更好的结果。如果您使用 Ffmpeg,并且它在您的上下文中存在性能问题,您可能会被阻止...因为您不会修改 Ffmpeg。

你说你会用博世相机。通常,所有编码的视频都采用相同的格式。因此,一旦您的代码能够对其进行解码,您实际上并不需要所有 Ffmpeg 功能。