次の方法で共有


DirectShow でのウィンドウ メディア コーデックの使用

Windows Media Audio および Video エンコーダーとデコーダー オブジェクトは、ASF ファイル コンテナー形式と Windows Media Format SDK を使用するように当初設計および最適化されていました。 コーデック オブジェクトは、特定のシナリオ (つまり、ビデオ ストリームの 1 パス CBR と品質ベースの VBR エンコード) に対して DirectShow で適切に機能します。 ただし、ASF 以外のファイル コンテナーを使用して DirectShow でコーデック オブジェクトを直接使用することを検討している場合は、事前に注意する必要がある特定の動作と問題があります。

Note

DirectShow でスタンドアロン コーデックを使用する場合は、DMU としてのみ使用することをお勧めします。 つまり、IMFTransform の代わりに IMediaObject インターフェイスを使用することになります。

 

AVI ファイル内の WM オーディオ

DirectShow を使用すると、マルチプレクサー フィルターがある任意のファイル コンテナー形式に WMA ストリームをエンコードできます。 ただし、Windows Media Audio および Video コーデック インターフェイスでは、既定の DirectShow AVI 再生フィルターを使用して WMA ストリームを使用した AVI ファイル内のオーディオ ビデオ同期を維持することは不可能であるため、AVI ファイルの WMA はサポートされていません。 詳細については、「 圧縮メディアを AVI ファイルに格納する」を参照してください。

オーディオエンコーダーDMOは、"一定ビットレート"モードの場合でも、さまざまな期間のサンプルを出力します。 そのため、タイムスタンプを使用するファイル コンテナー形式に最適です。 AVI ファイルには、各オーディオ サンプルまたはサンプル グループのタイム スタンプは提供されません。 DirectShow では、AVI スプリッター フィルターは、AVI ストリーム ヘッダーの WAVEFORMATEX 構造体の nAvgBytesPerSec 値に基づいて、サンプルの各グループ (各オーディオ フレーム) のタイム スタンプを製造します。

この計算の基になる前提は、ストリーム内のすべてのオーディオ サンプルが等しい期間であるということです。ただし、DMO によって出力されるサンプルの期間は等しくないため、AVI スプリッターによって適用されるタイム スタンプは正確ではありません。 したがって、AVI スプリッターまたはオーディオ デコーダー DMO を変更せずに、DirectShow ベースのアプリケーションを使用して、オーディオ ストリームとビデオ ストリームを同期して AVI ファイルを再生することはできません。Windows Media Audio 9 Voice コーデックは場合によっては動作しますが、シーク操作後に同期が失われる可能性があるため、実際には実行可能なソリューションとは見なされません。

MP3 エンコーダーがある場合は、オーディオ ストリーム用に WMV と MP3 を使用して AVI ファイルを作成できます。 AVI スプリッターには MP3 ストリーム用の特別な処理コードが含まれているため、このようなファイルはWindows メディア プレーヤーやその他の DirectShow ベースのアプリケーションで正しく再生され、シークされます。 もう 1 つのオプションは、圧縮されていない PCM オーディオを使用することですが、結果のファイル サイズは圧縮オーディオ ストリームよりもはるかに大きくなります。 DirectShow サンプル アプリケーションは AVI ファイルを作成するため、オーディオ エンコーダー DMO の使用方法を示していません。

ワンパス エンコード

ビデオ エンコーダー DMO は、CBR と品質ベースの VBR という 2 つのエンコード モードで DirectShow で簡単に動作します。 サンプル アプリケーションで示されているように、フィルター グラフを構築するときに正しい操作順序に従っている限り、AVI マルチプレクサーとファイル ライターを使用して WMV コンテンツを AVI ファイルに配置するのは比較的簡単です。

2 パス エンコード

2 パス エンコード モードでは、2 番目のパスを開始する前に DMO が最初のパスからコンテンツをフラッシュするのを防ぐために、グラフの構築とストリーミングに対するより複雑なアプローチが必要です。 2 パス エンコードでは、DMO がファイル データの前処理分析を実行できるようにグラフを 1 回実行し、グラフを巻き戻して、DMO が実際のエンコードを実行できるように再実行する必要があります。

グラフが 2 番目のパスの実行状態になると、DMO ラッパーは最初のサンプルで DISCONTINUITY フラグを設定します。これは、タイム スタンプが最初のパスの最後のタイム スタンプと連続していないためです。 この方法で DirectShow で動作するように設計されていない DMO が DISCONTINUITY フラグを受け取ると、フラッシュが実行され、最初のパスから格納されたデータが失われます。 この問題を回避するには、最初のパスの後にグラフをシークするときに DISCONTINUITY フラグを設定しないカスタム DMO ラッパー フィルターを作成することをお勧めします。 この SDK の Video for Windows (VfW) サンプルは、2 パス エンコードを実行する方法を示しています。

インターレース コンテンツ

WMV エンコーダー DMO は、インターレースを維持しながらインターレースされたコンテンツをエンコードできます。これは、テレビからキャプチャされ、テレビで再生される可能性のあるコンテンツに役立ちます。 ただし、既定の DMO ラッパーを使用してインターレースを保持することはできません。これは、そのフィルターが入力サンプル で INSSBuffer をサポートしていないためです。

DMO はそのインターフェイスを使用して、受け取る各サンプルのインターレース設定を取得します。 DMO ラッパーの場合と同様に、インターフェイスが見つからない場合、DMO は入力サンプルを非インターレースとして扱います。 DirectShow でインターレース エンコードを実行するには、いくつかの代替方法があります。 最も簡単な方法は、Windows Media Format 9 Series SDK を直接使用するか、WM ASF ライター DirectShow フィルターを使用して、インターレースされた ASF ファイルを作成することです。 その後、そのファイルを他の形式にトランスコードできます。 AVI にトランスコードすると、インターレースされたファイルが作成されますが、標準の DirectShow AVI 再生フィルターは VIDEOINFOHEADER2 をサポートしていないため、そのように認識されません。 もう 1 つの方法は、 INSSBuffer インターフェイスをサポートする独自の DMO ラッパー フィルターを作成することです。

コーデック DLO の操作