次のコードは、音声なしの MPG ファイルのレンダリングに適しています。
IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer)));
IFileSourceFilter *pSourceFilter;
IBaseFilter *pBaseFilter;
CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSourceFilter));
pSourceFilter->QueryInterface(IID_PPV_ARGS(&pBaseFilter));
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");
pSourceFilter->Load(filename, NULL);
pGraphBuilder->AddFilter(pBaseFilter, L"File Source Filter");
ただし、音声付きの WMV ファイルでは失敗します。ビデオソースの唯一の出力をビデオレンダラーの唯一の入力に接続すると、次の呼び出しでエラーが発生します。
pGraphBuilder->Connect(pOutPin[0], pInPin[0])
-2147220969を返します。上記のコードを次のコードに置き換えると:
IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer));
IBaseFilter *pBaseFilter;
pGraphBuilder->AddSourceFilter(filename, L"Renderer Filter", &pBaseFilter);
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");
次に、MPGは次のようにうまく機能します:
pGraphBuilder->Connect(pOutPin[0], pInPin[0])
WMV は上記と同じエラーになりますが、代わりに次のように逆さまに再生されます。
pGraphBuilder->Connect(pOutPin[1], pInPin[0])
これはすべて、2 番目のコーディング スタイルが 2 つの出力ピンを持つソースを作成し、おそらくオーディオが最初のピンにマッピングされることを意味します。または、A/V スプリッターが DirectShow によって自動的に挿入される場合もあります。
- 私の理解では、AddSourceFilterは透過的にスプリッターを作成できます。それが正しいか?
- 手動で行いたい場合、どのコンポーネントを使用すればよいですか?
- WMV ビデオが上下逆さまにレンダリングされるのはなぜですか?