3

単一のH.264ストリームを含み、オーディオストリームを含まないMP4ビデオがあります。DirectShowをC++で使用してビデオをデコードしたいのですが、DirectShowフィルターの設定に問題があり、誰かが助けてくれることを望んでいますか?

DirectShowを使用してWMV3ストリームをデコードするためのセットアップコードは次のとおりです。これはうまく機能しています。

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraph);

if (SUCCEEDED(hr))      hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_pFilter);
if (SUCCEEDED(hr))      hr = m_pFilter->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&filterConfig));
if (SUCCEEDED(hr))      hr = filterConfig->SetRenderingMode( VMR9Mode_Renderless );
if (SUCCEEDED(hr))      hr = filterConfig->SetNumberOfStreams(2);
if (SUCCEEDED(hr))      hr = SetAllocatorPresenter( m_pFilter, g_pMainWindow );
if (SUCCEEDED(hr))      hr = m_pGraph->AddFilter(m_pFilter, L"Video Mixing Renderer 9");
if (SUCCEEDED(hr))      hr = m_pGraph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&m_pMediaControl));
if (SUCCEEDED(hr))      hr = m_pGraph->QueryInterface(IID_IBasicAudio, reinterpret_cast<void**>(&m_pBasicAudio));
if (SUCCEEDED(hr))      hr = m_pGraph->RenderFile( lpFilename, NULL );

しかし、MP4をデコードするための正しいセットアップを理解することはできません。他の投稿で発見されたように、すでに3ivxとffdshowをインストールしました。これで、GraphEditでファイルを開いて、適切なグラフを表示できます(64ビットマシンを使用しています。64ビットバージョンのGraphEditを実行すると、このDOESNが実行されます。 「動作しませんが、32ビットのものは動作します...それはそれと関係があるのでしょうか?)VLCは私のビデオをうまく再生できます。

これに固有の例をインターネット全体で検索しましたが、見つかりません。

私のビデオファイル形式は次のとおりです(ffmpeg出力):

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2013-01-16 19:14:52
  Duration: 00:05:25.62, start: 0.033367, bitrate: 3396 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3393 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 2013-01-16 19:14:52
      handler_name    : ?Mainconcept Video Media Handler

どんな助けでも大歓迎です!

よろしく、グラハム

4

1 に答える 1

0

Windows には標準/デフォルトの MP4 デマルチプレクサがないため、MP4 をカバーする拡張 DirectShow にインストールする必要があります。

  • コード/アプリ (または GraphEdit) のビット数に一致するように、適切なビット数 (32 ビット対 64 ビット) のデマルチプレクサをインストールする必要があります。
  • 独自のデマルチプレクサが組み込まれているため、VLC は問題ではありません。
  • H.264 デコーダーも必要で、すでにお持ちのようです

あなたのコードはほぼ正しいですが、このグラフ作成方法はあまり現実的ではありません。まず、役立つエラー コードが表示されているかどうかを確認する必要があります (おそらくRenderFile通話中です)。

GraphEdit Win32 がこのシステムで動作する場合、必要なすべてのコンポーネント (フィルター) が利用可能です。違いは、GraphEdit はユーザーが行う方法でグラフを作成しないことです。代わりにIGraphBuilder::AddSourceFilter、指定されたファイルを使用して開始フィルターを追加し、そのピンをレンダリングします。同じアプローチを採用し、最後のステップでビデオ プレゼンテーション用の VMR フィルターを追加すると、うまくいくでしょう。

于 2013-01-24T23:56:49.280 に答える