有些音频流包含了较大的音频音量范围,用户可能想限制此声音大小。上述情况对于从经典音乐到电影原声带的各种音频源来说都可能存在。
峰值音量和平均音量之间的差别称为动态范围。windows media player 12 如果用户启用了动态范围控制,则 Windows Media Audio Professional 编码支持创作峰值音量和平均音量,这些音量将对播放过程中可用的动态范围进行控制。

注 Windows Media Audio Lossless 编码还支持作者控制的动态范围控制。
对音频内容进行编码之后,Windows Media Audio Professional 编码会计算该编码内容的峰值音量和平均音量。它会在文件的元数据中两次插入这些值:作为只读参考值和作为读写目标值。参考值会保留内容的原始值。如果用户启用了动态范围控制,则在解码过程中这四个值都会用到。因为目标值可以更改,所以利用编码应用程序,内容作者能够指定新值,以便在用户启用了动态范围控制的情况下调整播放。
编码应用程序应该显示参考值,以便内容作者能够选择合适的目标值。它应该对峰值目标值和平均目标值都强制使用最大值 0 dB 和最小值 -90 dB。
Windows Media Format SDK 为这四个属性提供了下列常量:
编码应用程序应该向内容作者明确表明,不建议设置平均目标值。调整这个平均值不会影响高低声音差别,而会降低或者大大提高整体平均音量,从而导致播放过程中不希望出现的失真。
播放应用程序通过使用输出设置 g_wszDynamicRangeControl 来启用动态范围控制。该应用程序使用 Reader 对象的 IWMReaderAdvanced2::SetOutputSetting 方法来配置该设置。值为零(默认值)指定不更改动态范围。值为 1 指定中等级别的动态范围压缩。值为 2 指定高级别的动态范围压缩。
注 在 Windows Media Player 9 Series 以及更高版本中,Quiet Mode 的用户界面选项决定着动态范围控制。设置 Off、Medium difference 和 Little difference 分别与 g_wszDynamicRangeControl 值 0、1 和 2 相对应。
下表说明了 g_wszDynamicRangeControl 设置在播放过程中产生的效果。
如果您要使用 Windows Media Format SDK 构建编码应用程序,则应该提供一个用户界面,以便内容作者能够指定这些目标值。然后,该应用程序应该根据需要修改 g_wszWMWMADRCPeakTarget 和 g_wszWMWMADRCAverageTarget 元数据属性。您还应该提供一个使得用户能够指定要应用的动态范围控制程度的用户界面。
下面的代码示例演示了如何使用 Windows Media Format 9 Series SDK 或更高版本来写入和读取多声道音频。
写入多声道输出
下面的示例代码演示了如何将缩混数据写入一个多声道 ASF 文件:
//Some useful defines, although not all are used in this code example
#define DEFAULT_SURROUND_MIX -3
#define DEFAULT_CENTER_MIX -3
#define DEFAULT_LFE_MIX -12
#define INVALID_AUDIO_VALUE 1
#define MINUS_INFINITY 0x80000000 // 2147483648
#define PLUS_INFNITY 0x7FFFFFFF // 2147483647
#define KMIXER_LOG_CONSTANT1 20.0
#define KMIXER_LOG_CONSTANT2 65536.0
#define OUT_FORMAT L"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"
// Name: SixToTwoFoldDown
// Desc: This is the essential fold-down algorithm
HRESULT SixToTwoFoldDown( long lSurroundMix,
long lCenterMix,
long lLFEMix,
LPWSTR pwszTable,
DWORD dwLen )
{
if( NULL == pwszTable )
{
return( E_POINTER );
}
double dLinearSurroundMix, dLinearCenterMix, dLinearLFEMix;
long W, X, Y, Z;
double dbB;
// Calculate coefficients
dLinearSurroundMix = pow( 10.0, ( (double) lSurroundMix ) /
KMIXER_LOG_CONSTANT1 );
dLinearCenterMix = pow( 10.0, ( (double) lCenterMix ) /
KMIXER_LOG_CONSTANT1 );
dLinearLFEMix = pow( 10.0, ( (double) lLFEMix ) /
KMIXER_LOG_CONSTANT1 );
dbB = 1.0 / ( 1.0 + dLinearSurroundMix + dLinearCenterMix +
dLinearLFEMix );
// KMixer requires log values scaled by 65,536
W = (long) ( KMIXER_LOG_CONSTANT1 * KMIXER_LOG_CONSTANT2 *
log10( dbB ) );
X = (long) ( KMIXER_LOG_CONSTANT1 * KMIXER_LOG_CONSTANT2 *
log10( dLinearSurroundMix * dbB ) );
Y = (long) ( KMIXER_LOG_CONSTANT1 * KMIXER_LOG_CONSTANT2 *
log10( dLinearCenterMix * dbB ) );
Z = (long) ( KMIXER_LOG_CONSTANT1 * KMIXER_LOG_CONSTANT2 *
log10( dLinearLFEMix * dbB ) );
// Print out into a string.
_snwprintf( pwszTable, dwLen-1,
OUT_FORMAT , //L"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"
W, (long) MINUS_INFINITY, // L values
(long) MINUS_INFINITY, W, // R values
Y, Y, // C values
Z, Z, // LFE values
X, (long) MINUS_INFINITY, // LS values
(long) MINUS_INFINITY, X ); // RS values
*(pwszTable + dwLen - 1 ) = L'\0';
return S_OK;
}
// Name: SetFoldDownProperty
// Desc: Sets the fold-down property string on the specified ASF stream
HRESULT SetFoldDownProperty ( long lSurroundMix, long lCenterMix, long lLFEMix, WORD wStreamNum, IWMHeaderInfo* pHeader)
{
HRESULT hr;
// Wide character buffer to hold the property strings
WCHAR wszTable[MAX_PATH];
memset( wszTable, 0, sizeof(WCHAR) * MAX_PATH );
// Variables used in SetAttribute
WMT_ATTR_DATATYPE datatype = WMT_TYPE_STRING;
WORD cbLen = 0;
BYTE* pData = NULL;
// Check for valid input
if ( ( lSurroundMix <= 0 && lSurroundMix >= -144) &&
( lCenterMix <= 0 && lCenterMix >= -144) &&
( lLFEMix <= 0 && lLFEMix >= -144))
{
// Calculate the fold-down values and write them as a string
// into the buffer provided.
// In this example, we only do 5.1 to 2 fold-down.
hr = SixToTwoFoldDown( lSurroundMix, lCenterMix, lLFEMix,
wszTable, MAX_PATH );
if(SUCCEEDED(hr))
{
cbLen = sizeof(WCHAR) * ( wcslen( pwszAttribValue ) + 1);
pData = (BYTE*) wszTable;
// Now set the attribute for the stream in the ASF file
hr = pHeader->SetAttribute( wStreamNum, //zero-based
g_wszFold6To2Channels3,
datatype,
pData,
cbLen );
}
}
else
{
hr = E_INVALIDARG;
}
return hr;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-45425-3.html
从哪里开始
少讲话
贬值更加快