使用动态范围控制

[与此页面关联的功能 Windows Media Format 11 SDK 是旧版功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用源读取器和接收器编写器,而不是 Windows Media Format 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

一段音频内容的动态范围基本上是最低音量和最大音量之间的差异。 如果内容的动态范围过高,用户可能会发现自己在播放期间反复调整音量。 例如,电影通常具有较高的动态范围。 通常,当调整音量以便可以在安静的场景中理解对话时,具有音乐或声音效果的电影的其他部分会比预期大声。

Windows Media Audio 9 Professional 和 Windows Media Audio 9 无损编解码器支持称为动态范围控制的功能。 在编码时,编解码器计算内容中的峰值和平均振幅值,编写器对象在编码完成后将这些值存储在流的元数据中。 (可选)应用程序还可以将“目标”值编写为元数据,播放器应用程序和解码器可以在播放文件时用作提示。 在播放时,应用程序可以指定要应用于音频流的动态范围控制级别。

Windows 媒体播放器将动态范围控制作为“安静模式”功能实现。

何时使用动态范围控件

动态范围控件可以更改内容的声音。 因此,不应将应用程序配置为自动使用动态范围控制。 相反,让用户能够根据需要打开或关闭动态范围控制。

使用动态范围控件

播放时,使用输出设置g_wszDynamicRangeControl激活动态范围控制。 使用 IWMReaderAdvanced2::SetOutputSetting 配置设置。 (默认) 的值为零,表示不应更改动态范围。 值 1 或 2 指示编解码器执行动态范围控制,其中 1 是中等级别的动态范围压缩,2 是高级别的动态范围压缩。

在编码时或播放时,可以通过分别设置 WM/WMADRCPeakTarget 和 WM/WMADRCAverageTarget 属性,为峰值和平均级别提供编解码器目标 PCM 值。 这些值存储为元数据属性,应使用 IWMHeaderInfo3 接口的方法进行访问。 使用专业编解码器或无损编解码器对音频流进行编码时, WM/WMADRCPeakReferenceWM/WMADRCAverageReference 属性将自动设置为原始内容的峰值和平均级别。 默认情况下,目标值设置为与引用相同的值。

播放时解码器根据所选的动态范围控件级别和目标值 ((如果指定了) )计算动态范围。 下表显示了可能的范围。

设置 传送的音频范围
g_wszDynamicRangeControl = 0 (任何目标值) 与原始内容相同的范围。
g_wszDynamicRangeControl = 1 (目标值等于引用值) 保持平均水平,峰值限制在平均 +12 dB。
g_wszDynamicRangeControl = 2 (目标值等于引用值) 保持平均级别,峰值限制在平均 +6 dB。
g_wszDynamicRangeControl = 1 (指定) 目标值 平均级别设置为目标平均值,峰值限制为目标峰值。
g_wszDynamicRangeControl = 2 (指定) 目标值 平均级别设置为目标平均值,峰值限制为目标平均值和目标峰值的中值。

 

请注意,动态范围控件是仅解码的一项功能,仅作为元数据存在于文件本身中。 除非你专门指示解码器使用它们,否则这些设置对存储在文件中的内容没有影响。 Windows Media Format SDK 不提供用于在编码时修改音频数据的动态范围的方法。

高级主题