2012-01-12 192 views
0

我正在为Windows Media Player编写一个音频DSP插件,插件充当DMO。我试图让WMP向我发送单声道22.050 kHz音频的音频数据。但是,无论我做什么,播放器都会将所有音频重新采样为立体声44.1k数据。即使我正在播放的文件是22.050khz波形文件,我仍然会在插件中获得44.1音频。Windows Media Player DSP插件格式协商

我指定了我的插件可以通过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

您是否在您的'SetInputType'中为44.1 kHz格式返回错误代码? – 2012-01-12 19:10:09

+0

另一个可能的原因是您的DMO不是WMP使用的唯一一个。它具有内部音量标准化,SRS效果等等,它们可以在音频数据实际到达DMO之前切换到44.1 kHz。 – 2012-01-12 19:24:27

+0

我确实返回了错误代码。问题最终成为WMP本身,但感谢您的建议 – Nate 2012-01-12 20:24:31

回答

1

不幸的是它看起来问题不是我。由于这个问题给我造成的一切麻烦,我将它归档在这里供将来参考。我发现了有关problem on an msdn blog的详细报告,看来在Vista和更高版本中,您无法通过设计为DMO插件协商媒体类型。我不能说我同意这个决定,但我的意思是如果我想要下采样数据,我必须自己进行转换。

希望这可以帮助任何碰到这个“功能”的人。