【问题标题】:DirectX vs FFmpegDirectX 与 FFmpeg
【发布时间】:2019-02-13 04:14:27
【问题描述】:

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

  1. 平台是 Windows。
  2. 帧以 H264 或 H265 编码。
  3. 应该尽可能多地使用 GPU
  4. 当然,我们更喜欢更少的编码和最简单的代码。我们只需要解码并在屏幕上显示结果。不需要录音,其他什么都不需要。

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

【问题讨论】:

  • directx 是一个图形渲染API,它不解码视频
  • 你确定吗?新版本的directx 与名称媒体基金会一起来
  • 对于 VTT,使用 GPU 解码视频的接口称为 IDirectXVideoDecoder,它是 MediaFoundation API 的一部分。

标签: ffmpeg directx decode h.264 h.265


【解决方案1】:

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

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

如果没有,您可以使用 MediaFoundation 或 FFMPEG,两者都可以。

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

编辑

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

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

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

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

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

或者研究一个像 MPC-HC 这样的程序来显示混合。我已经帮不上忙了。

编辑 2

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

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

了解哪一个提供更好的结果、消耗更少的资源(CPU、GPU、RAM(系统内存和显卡内存)、支持更广泛的格式等)也很重要。

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

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

您说您将使用博世相机。通常,所有编码的视频都将采用相同的格式。因此,一旦您的代码能够对其进行解码,您就真的不需要所有 Ffmpeg 功能了。

【讨论】:

  • 我下载并可以构建项目。但是当我运行它时,我没有得到任何结果。程序在执行后立即终止。
  • 我终于可以运行它了。也许原因是我的视频文件。这是一个非常好的开始样本。但在开始之前,让我知道我是否可以将帧发送到 directx 而不是为其引入文件。如果不可能将帧而不是整个文件提供给directx,我需要改用ffmpeg。在示例 hw_decode.c 中,如何在屏幕上显示解码后的帧?
  • 您的代码运行良好,但对我来说似乎太复杂了,因为我从来没有通过硬件解码,也没有直接在显卡内存上渲染过。现在我应该决定遵循哪一种方法; directx 或 ffmpeg。正如您所提到的,源视频的任何更改都会直接影响我的代码,我应该为它准备我的代码,而在 ffmpeg 中,它似乎可以处理多种格式。如果输入格式从 h264 更改为 h265,我的代码可能不需要太多更改。所以似乎从 ffmpeg 开始让我的代码更简单。我说的对吗?
  • 如果我是对的,我应该提取渲染框架的部分代码。这并不简单,因为我应该先了解您的代码。我不知道是否可以在屏幕上渲染 MF 尚未解码的内容(屏幕我的意思是硬件表面)。我怎样才能混合它们?我发现 directx 可用的最大表面数是 32。我说的对吗?如果是这样,我怎样才能显示 8x8 相机的矩阵?您询问了输入格式。我们(我们的客户)使用各种博世相机,主要是 H264 和 MJPEG。这可能包括将来的 H265。但我们也不能限制它。
  • 了解哪一种效果更好、消耗资源更少(CPU、GPU、RAM(系统内存和显卡内存)、支持更广泛的格式等)也很重要。 dxva2 只是 directx 上的一个包装器,它使编码更简单?我需要了解关于这两个上下文的很多事情。但是如果我想通过一个简短的方式,哪个是首选?我给你的示例代码提供了一个 mp4 文件,但它没有不接受,所以只好从你介绍的url下载,虽然hw_deocde可以解码,看来directx对输入文件格式比较敏感……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多