8

我的任务是修改使用 DirectShow 进行视频渲染的应用程序。旧的应用程序工作正常,但它开始显示年龄。

由于我有游戏背景,我想我应该这样处理。在使用不同的技术制作了一堆原型之后,我很确定我可以提取视频到纹理的渲染并使用 DirectX 来满足所有客户的要求。

然而,我现在必须选择一种技术,我不能再迷失了……

  • 直接秀
  • 媒体基金会
    • 媒体会话 (< Windows 8)
    • 媒体引擎 (> Windows 8)
  • DXVA1
  • DXVA2
  • DXVA-HD

DirectShow 显然是最古老的,但仍然运行良好,这主要是因为可用的编解码器数量巨大。

Media Foundation 是随 Windows Vista 一起引入的,并且在 Windows 8 之前有一个叫做“Media Session”的东西,之后他们引入了“Media Engine”。如果我是正确的编解码器称为 MFT?实际上有没有像 free-codecs.com 这样的网站?

除了这两种技术之外,还有 DXVA,它允许您将视频解码卸载到 GPU。目前,我遇到了 3 种不同的类型。DXVA1 是自 XP 以来一直存在的实现,DXVA2 是较新的 API。但是什么是 DXVA-HD?它比 DXVA2 更新还是等效名称?

我真的很想转向 Media Foundation,开箱即用的编解码器非常适合客户想要使用的格式。我所关心的是为它获取编解码器是多么容易...... Windows 8+ 默认媒体播放器是否仍然具有 DirectShow 和 MF 渲染路径并即时交换它们,或者微软是否完全淘汰了 DirectShow?

我也不太明白 DXVA 应该如何工作。鉴于我想基本上在游戏中渲染视频,只有让所有渲染实际发生在 GPU 上并将应用程序逻辑保留在 CPU 上才有意义,但我真的找不到任何关于如何使用 Media 来利用它的好例子基础。这主要是因为我不知道 DXVA2 和 DXVA-HD 之间的区别。Windows 7 SDK 附带了所有 3 种实现的示例...

如果有人能用粗体回答我的问题,纠正我的错误信息,并指出一个正确的例子(DirectX + Media Foundation + DXVA-whatever)的方向,我将非常感激!它可以像“结合这 3 个 Windows 7 SDK 示例来获得你想要的东西”一样简单。

整个任务的目标是让应用程序再次以一流的形式出现,我想绝对确定我选择了像 DirectShow 已经拥有的未来十年的技术:P

4

1 回答 1

9

如果我是正确的编解码器称为 MFT?实际上有没有像 free-codecs.com 这样的网站?

编解码器通常是从压缩格式解压缩为未压缩(解码器)或反之亦然(编码器)的软件项目。这两个 API 都不是完全使用编解码器,而是为具有输入和输出的组件定义通用接口,例如 DirectShow 中的过滤器、DirectX 媒体对象 (DMO) 或其演变 - 媒体基础转换 (MFT)。

MFT 是 Media Foundation 的基础组件:编码器、解码器、效果器、缩放器、视频捕获设备 - 都在内部具有 MFT,并且在此之上构建了更高级别的 API。

由于对媒体基金会的兴趣有限,总体而言,第三方 MFT 很少见。虽然您可以在 DirectShow 过滤器外形中找到几乎任何东西,但 Media Foundation 和 MFT 并非如此。

但是什么是 DXVA-HD?它比 DXVA2 更新还是等效名称?

DXVA-HD 是 DXVA 2.0 API 系列的一部分,涵盖硬件加速视频处理。作为公共低级接口提供,它也集成在 DirectShow 和 Media Foundation 库存组件中。

Windows 8+ 默认媒体播放器是否仍然同时具有 DirectShow 和 MF 渲染路径并即时交换它们,或者微软是否完全淘汰了 DirectShow?

是的,WMP 12 仍然兼具两者。Windows 10 影视播放器仅支持 MF。

鉴于我想基本上在游戏中渲染视频,只有让所有渲染实际发生在 GPU 上并将应用程序逻辑保留在 CPU 上才有意义,但我真的找不到任何关于如何使用 Media 来利用它的好例子基础。

DirectShow 和 Media Foundation 都提供支持 DXVA 的股票解码器(主要用于 H.264,但不仅限于)。我会说 DirectShow 实现相当不灵活,旨在与 EVR 一起使用。Media Foundation 的实现更加灵活,可以在 MF 管道之外用作 MFT。然而,两者都是为了隐藏所有复杂性并在幕后自动利用 DXVA 解码。

...而且我想绝对确定我会选择像 DirectShow 已经拥有的能够在未来十年持续使用的技术

DirectShow 作为一个遗留 API 仍然存在,在示例、代码、公共信息、文档、第三方可扩展性方面提供了更丰富的产品。媒体基金会是一个有意的替代品,对它的兴趣非常有限。与 DirectShow 相比,它基本上没有提供太多功能,Microsoft 并没有开发它来涵盖 DirectShow 的功能集——通常期望从较新的 API 中获得的功能,不提供有用的开发人员工具。看起来似乎认为 MF 是一个较新的东西应该自己出售它,但最终它没有成功:

... DirectShow 的奇迹在于,尽管它是在 1995 年编写的,但原始代码仍然支持从那时起开发的许多狂野多样的多媒体格式。我知道的最新基类更新是从 2009 年开始的,在 Windows 7 SDK 中,但即使是与原始版本相比也只有很小的修改。

[...]

但请记住,即使在 7 年前,DirectShow 已经 15 岁了。基类从一开始就以源代码形式发布。他们已经得到关心的程序员超过 2 年的关注。这些问题很久以前就解决了。

[...]

现在,说了这么多,Redmond 的人确实认为 DirectShow 是一种死技术。他们已经转移到媒体基金会,原因完全让我无法理解。我还没有找到 Media Foundation 比 DirectShow 解决得更好的问题。它固有的局限性意味着它根本无法解决一些问题。我永远无法理解他们为什么选择重新开始,而不是修补他们在 DShow 中不喜欢的任何东西。尽管词汇不同,但基本概念完全相同。这只是浪费资源。

2019 年 7 月更新

我想链接微软的 James Dailey关于 DirectShow 相关问题的评论,它还巧妙地概述了 DirectShow 截至 2019 年的整体状态:

请记住,虽然 DirectShow 在技术上仍受支持,但我们正在弃用这项传统技术。我们要求您尽快转移到 MediaFoundation。

于 2016-08-01T20:39:46.220 回答