0

DMO として機能するプラグインを使用して、Windows Media Player 用のオーディオ DSP プラグインを作成しています。WMP にオーディオ データをモノラル 22.050 khz オーディオで送信させようとしています。ただし、何をしても、プレーヤーはすべてのオーディオをステレオ 44.1k データに再サンプリングします。再生しているファイルが 22.050khz の wave ファイルであっても、プラグインで 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 に答える