0

次のコードは、音声なしの 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 ビデオが上下逆さまにレンダリングされるのはなぜですか?
4

2 に答える 2

2

-2147220969 を返します

これは0x80040217 VFW_E_CANNOT_CONNECT、「接続を確立するための中間フィルターの組み合わせが見つかりませんでした」ということです。

これは、手動で追加した結果ですCLSID_AsyncReader。Windows Media ファイルは通常、別のソース フィルターを介してレンダリングされます (Windows SDK の GraphEdit を使用してファイルをレンダリングすると、トポロジを調べることができます)。

私の理解では、 AddSourceFilter は透過的にスプリッターを作成できます。それが正しいか?

はい、スプリッターが Async Reader と互換性がある場合、そうではありません。

手動で行いたい場合、どのコンポーネントを使用すればよいですか?

GraphEdit を使用してインタラクティブにトポロジを作成すると、コードで何をすべきかがわかります。

WMV ビデオが上下逆さまにレンダリングされるのはなぜですか?

トポロジーのためです。ほとんどの場合、サード パーティのフィルターを含め、パイプラインに奇妙な組み合わせのフィルターが使用されています。問題を解決するには、有効なトポロジを調べることが重要です。

于 2013-07-02T14:57:58.843 に答える