Windows Vista 中的 DVD 播放增强功能

[与本页关联的功能 DirectShow 是一项旧版功能。 它已被 MediaPlayerIMFMediaEngine媒体基础中的音频/视频捕获所取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngine媒体基础中的音频/视频捕获,而不是 DirectShow。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]

本部分介绍了 Windows Vista 中 DVD 播放和导航的改进。

指定解码器

在早期版本的 DirectShow 中,生成 DVD 播放图时很难指定特定的 MPEG-2 解码器。 从 Windows Vista 开始,应用程序可以按如下所示指定解码器:

  1. 在调用IDvdGraphBuilder::RenderDvdVideoVolume之前,将解码器添加到图形。
  2. 调用RenderDvdVideoVolume并设置AM_DVD_DO_NOT_CLEAR 标志。 DVD 导航器将优先选择添加的解码器。

支持增强的视频呈现器

建议为 Windows Vista 或更高版本编写的应用程序使用增强的视频呈现器 (EVR) 播放视频。 要在 DVD 播放应用程序中使用 EVR,请在调用Render DvdVideoVolume时设置AM_DVD_EVR_ONLY 标志。

要在生成图形之前配置 EVR,请调用IDvdGraphBuilder::GetDvdInterface并查询IEVRFilterConfigIMFVideoRenderer接口。 (媒体基础 SDK 文档中记录了这些接口。)有关在 DVD 播放图中配置视频呈现器的详细信息,请参阅生成 DVD 筛选器图

除非解码器的IAMDecoderCaps::GetDecoderCaps::GetDecoderCaps方法返回AM_GETDECODERCAP_QUERY_EVR_SUPPORT 标志,否则 DVD 导航器不会使用 EVR。 定义此标志以确保应用程序与现有解码器兼容。 如果RenderDvdVideoVolume使用 AM_DVD_EVR_ONLY 标志失败,请再次调用该方法(不调用标志)以回退到另一个视频呈现器。

平滑反向播放

DVD 导航器现在可以执行平滑反向播放。 在平滑反向播放中,DVD 导航器将整个视频对象单元 (VOBU) 发送到解码器,解码器按反向顺序发出帧。 此功能要求解码器支持平滑反向播放。

当应用程序将播放速度设置为负值时,DVD 导航器会查询AM_RATE_ReverseMaxFullDataRate属性的解码器。 此属性的值是最大反向速度 x 10000 的绝对值。 例如,如果最大反向速度为 -2.0,则值为 20000。

如果视频解码器支持该属性,则 DVD 导航器使用平滑反向播放。 如果音频解码器支持该属性,会反向播放音频流;否则,音频流会静音。 如果视频解码器不支持该属性,或者播放速率超过视频解码器的最大反向速率,DVD 导航器会切换到扫描模式。 在扫描模式下,DVD 导航器仅向解码器发送 I 帧,并删除所有 B 和 P 帧。

在平滑反向播放期间,DVD 导航器会将完整的 VOBU 发送到解码器。 DVD 导航器按反向顺序发送 VOBU,但以正常正向顺序发送每个 VOBU 中的帧。 在每个 VOBU 开始时,DVD 导航器会在示例上设置 AM_ReverseBlockStart 标志。 在 VOBU 的末尾,DVD 导航器会发送带有AM_ReverseBlockEnd 标志的空样本。 要检索这些标志,请对示例调用IMediaSample2::GetProperties。 标志在AM_SAMPLE2_PROPERTIES结构的dwTypeSpecificFlags成员中设置。

解码器会缓存视频数据,直到它收到带有AM_ReverseBlockEnd 标志的示例。 此时,解码器按反向顺序传递解码的帧。 例如,如果 VOBU 1 包含帧 1-4,VOBU 2 包含帧 5-8,DVD 导航器将按以下顺序发送帧:

(块启动)F5 F6 F7 F8(块结束)(块开始)F1 F2 F3 F4(块结束)

解码器应按如下所示处理帧:

  1. 解码 VOBU 2。
  2. 输出帧:F8 F7 F6 F5
  3. 解码 VOBU 1。
  4. 输出帧:F4 F3 F2 F1

DVD 导航器在 VOBU(本示例中为 F1 和 F5)的第一个示例上设置时间戳,但时间戳包含块开始的呈现时间,因此解码器应将此时间应用于块(F4 和 F8)中的最后一个样本。 在反向播放期间,呈现时间增加。

通常,VOBU 最多包含 42 帧,并且可能包含多个图片组 (GOP)。 要使整个 VOBU 能够解码,解码器应缓存解码的 I 和 P 帧。 DVD 上的 VOBU 不是闭合 GOP,因此 GOP 中的 B 帧可能需要解码之前 GOP 中的所有引用帧。 如果解码器没有足够的图面来容纳所有解码的帧,可能需要重新解码所选帧。

速率变化

默认情况下,DVD 导航器会在速率变化之间刷新图形。 但是,如果解码器支持AM_RATE_ResetOnTimeDisc属性,DVD 导航器不会刷新图形,导致播放速率之间的转换更流畅。

无论实际播放速度如何,DVD 导航器始终以 1 倍的播放速度设置示例时间戳。 解码器必须缩放解码样本上的时间戳,以匹配实际播放速度。 (有关详细信息,请参阅AM_RATE_SimpleRateChange 属性。)因此,当以 1 倍以外的速度播放时,解码帧上的时间戳与编码帧上的时间戳不同。 每当 DVD 导航器在示例上设置AM_SAMPLE_TIMEDISCONTINUITY 标志时,解码器应重新同步其时间戳。 换句话说,解码的帧应具有与输入帧相同的时间戳。 要检索 AM_SAMPLE_TIMEDISCONTINUITY 标志,请对示例调用IMediaSample2::GetProperties。 标志在AM_SAMPLE2_PROPERTIES结构的dwSampleFlags成员中设置。

电源管理

在 Windows Vista 中,DVD 导航器对电源管理进行以下改进:

  • 更高的计时器分辨率
  • 更大的数据缓存

计时器分辨率:应用程序可以调用timeBeginPeriod函数以请求最小计时器分辨率。 更高的分辨率(更短的时间段)会增加系统对定期事件的响应能力(例如超时),但也会增加线程上下文切换的频率。

默认情况下,DirectShow 中的引用时钟将计时器分辨率设置为 1 毫秒。 在该分辨率下,CPU 不会进入任何节能模式。 从 Windows Vista 开始,DVD 导航器在引用时钟上调用IReferenceClockTimerControl::SetDefaultTimerResolution以替代引用时钟的默认行为。 这会删除时钟对 1 毫秒计时器分辨率的请求。 这可能允许 CPU 进入节能模式。

计时器分辨率是全局设置;Windows 选取最低的请求值。 视频混合呈现器 (VMR) 筛选器(VMR-7 和 VMR-9)将计时器分辨率设置为 1 毫秒。 EVR 通常将分辨率设置为 4 到 8 毫秒之间的值,具体取决于是否启用桌面合成以及 EVR 是否处于全屏模式。 其他应用程序也可能设置分辨率。

缓存大小:应用程序可以在IDvdControl2::SetOption方法中设置DVD_CacheSizeInMB 选项以指定 DVD 导航器缓存的数据量。 如果应用程序将此标志设置为较大值 (> 50 MB),DVD 驱动器可能会在初始预提取后减速旋转(具体取决于硬件),这可以减少能耗。

DVD 应用程序