プロジェクトをファイルに書き込む
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
[この API はサポートされていないため、今後変更または使用できない可能性があります。]
この記事では、 DirectShow Editing Services プロジェクトをファイルに書き込む方法について説明します。 最初に、基本的なレンダリング エンジンを使用してファイルを書き込む方法について説明します。 次に、スマート レンダリング エンジンを使用したスマートな再圧縮について説明します。
DirectShow Editing Services によるプロジェクトのレンダリング方法の概要については、「 レンダリング エンジンについて」を参照してください。
基本的なレンダリング エンジンの使用
まず、次のようにグラフのフロントエンドを作成します。
- レンダリング エンジンを作成します。
- タイムラインを指定します。
- レンダリング範囲を設定します。 (省略可能)
- グラフのフロントエンドを作成します。
次のコード例は、これらの手順を示しています。
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
次に、マルチプレクサーとファイル書き込みフィルターをフィルター グラフに追加します。 これを行う最も簡単な方法は、 キャプチャ グラフを構築するための DirectShow コンポーネントである Capture Graph Builder です。 キャプチャ グラフ ビルダーは 、ICaptureGraphBuilder2 インターフェイスを 公開します。 次の手順に従います。
- キャプチャ グラフ ビルダーのインスタンスを作成します。
- グラフへのポインターを取得し、グラフ ビルダーに渡します。
- 出力ファイルの名前とメディアの種類を指定します。 この手順では、後で必要になる mux フィルターへのポインターも取得します。
次のコード例は、これらの手順を示しています。
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
// Get a pointer to the graph front end.
IGraphBuilder *pGraph;
pRender->GetFilterGraph(&pGraph);
pBuilder->SetFiltergraph(pGraph);
// Create the file-writing section.
IBaseFilter *pMux;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("Output.avi"), &pMux, NULL);
最後に、フロントエンドの出力ピンをマルチプレクサ フィルタに接続します。
- グループの数を取得します。
- 各ピンについて、ピンへのポインターを取得します。
- 必要に応じて、ストリームを圧縮する圧縮フィルターのインスタンスを作成します。 コンプレッサーの種類は、グループのメディアの種類によって異なります。 システム デバイス列挙子を使用して、使用可能な圧縮フィルターを列挙できます。 詳細については、「 デバイスとフィルターの列挙」を参照してください。
- 必要に応じて、キー フレーム レートなどの圧縮パラメーターを設定します。 この手順については、この記事の後半で詳しく説明します。
- ICaptureGraphBuilder2::RenderStream を呼び出します。 このメソッドは、ピン、圧縮フィルター (存在する場合)、マルチプレクサーへのポインターを受け取ります。
次のコード例は、出力ピンを接続する方法を示しています。
long NumGroups;
pTimeline->GetGroupCount(&NumGroups);
// Loop through the groups and get the output pins.
for (i = 0; i < NumGroups; i++)
{
IPin *pPin;
if (pRender->GetGroupOutputPin(i, &pPin) == S_OK)
{
IBaseFilter *pCompressor;
// Create a compressor filter. (Not shown.)
// Set compression parameters. (Not shown.)
// Connect the pin.
pBuilder->RenderStream(NULL, NULL, pPin, pCompressor, pMux);
pCompressor->Release();
pPin->Release();
}
}
圧縮パラメーター (前の手順 4) を設定するには、 IAMVideoCompression インターフェイスを使用します。 このインターフェイスは、圧縮フィルターの出力ピンで公開されます。 圧縮フィルターのピンを列挙し、 IAMVideoCompression の各出力ピンに対してクエリを実行します。 (ピンの列挙の詳細については、「ピン の列挙」を参照してください)。この手順で取得したすべてのインターフェイス ポインターを必ず解放してください。
フィルター グラフを作成したら、フィルター グラフ マネージャーで IMediaControl::Run メソッドを呼び出します。 フィルター グラフを実行すると、データがファイルに書き込まれます。 イベント通知を使用して、再生が完了するまで待機します。 (「 イベントへの応答」を参照してください)。再生が完了したら、フィルター グラフを停止するには 、IMediaControl::Stop を明示的に呼び出す必要があります。 それ以外の場合、ファイルは正しく書き込まれません。
スマート レンダリング エンジンの使用
スマートリ圧縮の利点を得るには、基本的なレンダリング エンジンの代わりにスマート レンダリング エンジンを使用します。 グラフを作成する手順はほぼ同じです。 主な違いは、圧縮は、ファイル書き込みセクションではなく、グラフのフロントエンドで処理される点です。
重要
Windows Media ファイルの読み取りまたは書き込みにスマート レンダリング エンジンを使用しないでください。
各ビデオ グループには、そのグループの圧縮形式を指定する プロパティがあります。 圧縮形式は、グループの非圧縮形式 (高さ、幅、ビット深度、フレーム レート) と完全に一致している必要があります。 スマート レンダリング エンジンは、グラフの作成時に圧縮形式を使用します。 圧縮形式を設定する前に、 IAMTimelineGroup::SetMediaType を呼び出して、そのグループの非圧縮形式を設定してください。
グループの圧縮形式を設定するには、 IAMTimelineGroup::SetSmartRecompressFormat メソッドを呼び出します。 このメソッドは、 SCompFmt0 構造体へのポインターを受け取ります。 SCompFmt0 構造体には、0 である必要がある nFormatId と、AM_MEDIA_TYPE構造体である MediaType の 2 つのメンバーがあります。 形式情報を 使用して、AM_MEDIA_TYPE 構造体を初期化します。
注意
最終的なプロジェクトの形式をソース ファイルの 1 つと同じにする場合は、メディア検出機能を使用して、ソース ファイルから直接AM_MEDIA_TYPE構造を取得できます。 「IMediaDet::get_StreamMediaType」を参照してください。
次の例に示すように、 SCompFmt0 変数を long 型のポインターにキャストします。
SCompFmt0 *pFormat = new SCompFmt0;
memset(pFormat, 0, sizeof(SCompFmt0));
pFormat->nFormatId = 0;
// Initialize pFormat->MediaType. (Not shown.)
pGroup->SetSmartRecompressFormat( (long*) pFormat );
スマート レンダリング エンジンは、互換性のある圧縮フィルターを自動的に検索します。 ISmartRenderEngine::SetGroupCompressor を呼び出すことで、グループの圧縮フィルターを指定することもできます。
グラフを作成するには、前のセクションの基本レンダリング エンジンで説明したのと同じ手順を使用します。 唯一の違いは次のとおりです。
- 基本的なレンダリング エンジンではなく、スマート レンダリング エンジンを使用します。 クラス識別子がCLSID_SmartRenderEngine。
- フロントエンドをビルドした後、出力ピンをレンダリングする前に圧縮パラメーターを設定します。 グループの圧縮フィルターへのポインターを取得するには、 ISmartRenderEngine::GetGroupCompressor メソッドを呼び出します。 次に、前に説明したように、 IAMVideoCompression インターフェイスのクエリを実行します。
- 出力ピンをレンダリングするときに、圧縮フィルターを挿入する必要はありません。 ストリームは既に圧縮されています。
関連トピック