我正在为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;
}
答案 0 :(得分:1)
不幸的是,问题似乎不是我。我将这个存档在这里以供将来参考,因为这个问题引起了我的所有麻烦。我找到了关于problem on an msdn blog的详细报告,看来在Vista及以后您无法协商DMO插件的媒体类型按设计。我不能说我同意这个决定,但我的意思是如果我想要下采样数据,我必须自己进行转换。
希望这可以帮助其他遇到此“功能”的人。