【发布时间】:2012-02-09 00:32:21
【问题描述】:
我正在为 Windows Media Player 编写一个音频 DSP 插件,该插件充当 DMO。我正在尝试让 WMP 以单声道 22.050 khz 音频向我发送音频数据。但是,无论我做什么,播放器都会将所有音频重新采样为立体声 44.1k 数据。即使我正在播放的文件是 22.050khz 的波形文件,我的插件中仍然会得到 44.1 音频。
我通过GetInputType/GetOutputType 函数指定我的插件可以处理的数据,但无论在调用SetInputType/SetOutputType 时发生什么,格式都会恢复到44.1k。有谁知道发生了什么?我试着写ValidateMediaType 只接受我想要的采样率,但是我根本没有得到任何数据。我的GetInputType 函数如下
STDMETHODIMP CWMPIPSpeaker::GetInputType (
DWORD dwInputStreamIndex,
DWORD dwTypeIndex,
DMO_MEDIA_TYPE *pmt)
{
HRESULT hr = S_OK;
if ( 0 != dwInputStreamIndex )
{
return DMO_E_INVALIDSTREAMINDEX ;
}
// only support one preferred type
if ( 0 != dwTypeIndex )
{
return DMO_E_NO_MORE_ITEMS;
}
if ( NULL == pmt )
{
return E_POINTER;
}
hr = MoInitMediaType(pmt, sizeof( WAVEFORMATEX ) );
WAVEFORMATEX* format = ((WAVEFORMATEX*)pmt->pbFormat);
format->nChannels = 1;
format->nSamplesPerSec = 22050;
format->wFormatTag = WAVE_FORMAT_PCM;
format->wBitsPerSample = 16;
format->cbSize = 0;
format->nBlockAlign = (format->nChannels * format->wBitsPerSample) / 8;
format->nAvgBytesPerSec = format->nBlockAlign * format->nSamplesPerSec;
pmt->formattype = FORMAT_WaveFormatEx;
pmt->lSampleSize = format->nBlockAlign;
pmt->bFixedSizeSamples = true;
pmt->majortype = MEDIATYPE_Audio;
pmt->subtype = MEDIASUBTYPE_PCM;
return hr;
}
【问题讨论】:
-
对于 44.1 kHz 格式,您是否在
SetInputType中返回错误代码? -
另一个可能的原因是您的 DMO 不是 WMP 使用的唯一一个。它具有内部音量归一化、SRS 效果等,它们会在一个链中建立起来,他们可能更愿意在音频数据实际到达您的 DMO 之前切换到 44.1 kHz。
-
我确实返回了错误代码。问题最终出在 WMP 本身,但感谢您的建议