【问题标题】:Windows Media Player DSP Plugin Format NegotiationWindows Media Player DSP 插件格式协商
【发布时间】: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 本身,但感谢您的建议

标签: c++ windows wmp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多