ASF ファイル シンクへのストリーム情報の追加

ASF ファイル シンクは、アプリケーションが ASF メディア データをファイルにアーカイブするために使用できる Media Foundation によって提供される IMFMediaSink の実装です。 ASF メディア シンクのオブジェクト モデルと一般的な使用方法については、「 ASF メディア シンク」を参照してください。

ファイル シンクをインスタンス化した後、トポロジを構築する前に構成する必要があります。 ファイル シンクは、出力ファイル内のストリーム、エンコード モード情報、およびメタデータについて認識する必要があります。 このトピックでは、ファイル シンクにストリームを追加するプロセスについて説明します。

ASF ファイル シンクへのストリームの追加

それに応じて出力サンプルを生成し、出力 ASF ファイルに追加できるように、ファイル シンクは出力ストリームとそのプロパティを認識している必要があります。 これらの設定は、最終的な ASF ヘッダー オブジェクトに書き込まれます。

ストリーム情報を設定するには、ファイル シンクの ASF ContentInfo オブジェクトへの参照が必要です。 詳細については、「 ASF ファイル シンクの作成」を参照してください。

次の手順は、ASF プロファイル オブジェクトを使用してストリームを構成するための一般的な手順をまとめたものです。

ASF ファイル シンクでストリーム情報を構成するには

  1. MFCreateASFProfile を呼び出して ASF プロファイル オブジェクトを作成します。

  2. 出力ファイル内のストリームごとに、ファイル シンクに追加するターゲット ストリームのメディアの種類を作成します。 メディアの種類は、Windows Media エンコーダーでサポートされている出力の種類と互換性がある必要があります。

    プロファイルへのオーディオ ストリームの追加の詳細については、「ASF エンコード用のオーディオ ストリームの作成」を参照してください。

    プロファイルにビデオ ストリームを追加する方法については、「ASF エンコード用のビデオ ストリームの作成」を参照してください。

  3. IMFASFProfile::CreateStream を呼び出して、手順 2 で作成したメディアの種類に基づいてストリームを作成します。

  4. 手順 3 で受信した IMFASFStreamConfig インターフェイス ポインターを呼び出して、新しく作成されたストリームのストリーム番号を割り当てます。

  5. 必要に応じて、次の情報を使用してストリームを構成します。

  6. 必要に応じて、MF_ASFPROFILE_MINPACKETSIZE属性と MF_ASFPROFILE_MAXPACKETSIZE 属性を設定して、プロファイル データ パケット サイズを設定します。 ASF プロファイルは IMFAttributes インターフェイスを公開します。このインターフェイスは、アプリケーションが IMFASFProfile::QueryInterface を呼び出すことによって参照を取得できます。

  7. ファイル シンク内のストリームのエンコード情報を設定します。 「ファイル シンクでのプロパティの設定」で説明します

  8. IMFASFProfile::SetStream を呼び出して、ストリームをプロファイルに追加します。

  9. IMFASFContentInfo::SetProfile を呼び出して、プロファイルを ContentInfo オブジェクトに関連付けます。

既存のストリームを変更するために、アプリケーションはストリームの IMFASFStreamConfig インターフェイスへの参照を取得し、要件に従って再構成できます。 ストリームを追加または削除するには、アプリケーションで IMFASFProfile::RemoveStream を呼び出す必要があります。 これらの変更、ストリームの変更、または削除を適用するには、ContentInfo オブジェクトでプロファイルをもう一度設定する必要があります。 これにより、ContentInfo オブジェクトに既に関連付けられている既存のプロファイルが上書きされます。

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

ストリーム シンクの列挙

ContentInfo オブジェクトが認識しているプロファイル内のストリームごとに、ASF ファイル シンクによって、エンコードされたストリームのすべてのプロパティを含むストリーム シンクが作成され、追加されます。 ASF ファイル シンクは、固定ストリームを含むよう設計されています。 つまり、IMFMediaSink::AddStreamSink または IMFMediaSink::RemoveStreamSink を呼び出してストリームを追加または削除することはできません。 ファイル シンクでのこれらの呼び出しは、MF_E_STREAMSINKS_FIXEDエラー コードで失敗します。 プロファイルでストリームを追加または削除しても、ファイル シンク内のストリーム シンクは自動的に追加または削除されません。 プロファイル内のストリームが変更された場合は、ファイルの既存のインスタンスを破棄し、新しいストリーム情報で再作成する必要があります。

次の手順は、ASF ファイル シンク内のストリーム シンクを列挙するための一般的な手順をまとめたものです。

ストリーム シンクを列挙するには

  1. IMFMediaSink::GetStreamSinkCount を呼び出して、ASF ファイル シンク内のストリーム シンクの合計数を取得します。

  2. ストリーム シンクをループ処理すると、ストリーム シンクの GetStreamSinkByIndex インターフェイスへの参照が取得されます。

    \- または -

    IMFMediaSink::GetStreamSinkById を呼び出して、ストリーム番号を指定してストリーム シンクを取得します。 各ストリーム シンクは、プロファイルでストリームを作成するときに設定したストリーム番号で識別されます。

メディア ファイルをエンコードするための部分トポロジを構築する場合は、出力トポロジ ノードとしてトポロジにファイル シンクを追加する必要があります。 これを行うには、ファイル シンク内の各スチーム シンクを指定するか、ファイル シンクのアクティブ化オブジェクトとストリーム シンク識別子を設定します。 詳細とコード例については、「 出力ノードの作成」を参照してください。

ASF メディア シンク

Media Foundation での ASF サポート