次の方法で共有


プロジェクトをファイルに書き込む

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

[この API はサポートされていないため、今後変更または使用できない可能性があります。]

この記事では、 DirectShow Editing Services プロジェクトをファイルに書き込む方法について説明します。 最初に、基本的なレンダリング エンジンを使用してファイルを書き込む方法について説明します。 次に、スマート レンダリング エンジンを使用したスマートな再圧縮について説明します。

DirectShow Editing Services によるプロジェクトのレンダリング方法の概要については、「 レンダリング エンジンについて」を参照してください。

基本的なレンダリング エンジンの使用

まず、次のようにグラフのフロントエンドを作成します。

  1. レンダリング エンジンを作成します。
  2. タイムラインを指定します。
  3. レンダリング範囲を設定します。 (省略可能)
  4. グラフのフロントエンドを作成します。

次のコード例は、これらの手順を示しています。

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 インターフェイスを 公開します。 次の手順に従います。

  1. キャプチャ グラフ ビルダーのインスタンスを作成します。
  2. グラフへのポインターを取得し、グラフ ビルダーに渡します。
  3. 出力ファイルの名前とメディアの種類を指定します。 この手順では、後で必要になる 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);

最後に、フロントエンドの出力ピンをマルチプレクサ フィルタに接続します。

  1. グループの数を取得します。
  2. 各ピンについて、ピンへのポインターを取得します。
  3. 必要に応じて、ストリームを圧縮する圧縮フィルターのインスタンスを作成します。 コンプレッサーの種類は、グループのメディアの種類によって異なります。 システム デバイス列挙子を使用して、使用可能な圧縮フィルターを列挙できます。 詳細については、「 デバイスとフィルターの列挙」を参照してください。
  4. 必要に応じて、キー フレーム レートなどの圧縮パラメーターを設定します。 この手順については、この記事の後半で詳しく説明します。
  5. 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 インターフェイスのクエリを実行します。
  • 出力ピンをレンダリングするときに、圧縮フィルターを挿入する必要はありません。 ストリームは既に圧縮されています。

プロジェクトのレンダリング