0

我正在为 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;
}
4

1 回答 1

1

不幸的是,问题似乎不是我。由于这个问题给我带来的所有麻烦,我将其存档在这里以供将来参考。我在 msdn 博客上找到了有关该问题的详细报告,似乎在 Vista 及更高版本中,您无法通过设计协商 DMO 插件的媒体类型。我不能说我同意这个决定,但我的意思是如果我想要下采样数据,我必须自己进行转换。

希望这对遇到此“功能”的其他人有所帮助。

于 2012-01-12T20:21:15.523 回答