Share via


新しい ASF ヘッダー オブジェクトの生成

ContentInfo オブジェクトに含まれる情報をバイナリ ASF ヘッダー オブジェクト形式に変換するには、アプリケーションで IMFASFContentInfo::GenerateHeader を呼び出す必要があります。 この呼び出しは、データ パケットが生成され、ContentInfo オブジェクトに更新された情報が含まれている後に行う必要があります。 GenerateHeader は 、ヘッダー情報を有効な形式で含むメディア バッファーへのポインターを返します。 その後、アプリケーションは、新しい ASF ファイルの先頭にメディア バッファーが指すデータを書き込むことができます。

ContentInfo オブジェクトを使用して新しい Header オブジェクトを書き込むには

  1. 空の ContentInfo オブジェクトを作成するには、MFCreateASFContentInfo を呼び出します。

  2. IMFASFContentInfo::SetProfile を呼び出して、ContentInfo オブジェクトにプロファイル オブジェクトを指定します。 プロファイルの作成の詳細については、「 ASF プロファイルの作成」を参照してください。

  3. IMFASFContentInfo::GenerateHeader を呼び出し、pIHeader パラメーターに NULL を渡し、pcbHeader パラメーターで設定された ContentInfo オブジェクトのサイズを受け取ります。 アプリケーションでは、この値を使用して、Header オブジェクトを格納するメモリまたはメディア バッファーを割り当てることができます。

    受信するヘッダー サイズには、ヘッダー オブジェクトの実際のサイズに応じて調整されるパディング サイズが含まれます。 ヘッダー オブジェクトの最大サイズは 10 MB です。 サイズがこの値を超えると、 GenerateHeader はMF_E_ASF_INVALIDDATA エラーで失敗します。

  4. MFCreateMemoryBuffer を呼び出して、手順 3 で受信したサイズのメディア バッファーを作成します。

  5. GenerateHeader をもう一度呼び出して、手順 4 で作成したメディア バッファーの ContentInfo オブジェクトから新しい ASF ヘッダー オブジェクトを生成します。

    メディア バッファー内のデータの長さが更新され、新しいサイズが pcbHeader パラメーターで返されます。

  6. ファイルの先頭にメディア バッファーの内容を書き込みます。 アプリケーションでは、バイト ストリームを使用して書き込み操作を実行できます。 コード例については、「 IMFByteStream::Write」を参照してください。

次のコード例は、ContentInfo オブジェクトを作成し、新しい Header オブジェクトを格納するメディア バッファーを生成する方法を示しています。 このコードを使用する完全な例については、「 チュートリアル: ASF ストリームを 1 つのファイルから別のファイルにコピーする」を参照してください。

//-------------------------------------------------------------------
// WriteASFFile
//
// Writes the complete ASF file.
//-------------------------------------------------------------------

HRESULT WriteASFFile( 
    IMFASFContentInfo *pContentInfo, // ASF Content Info for the output file.
    IMFByteStream *pDataStream,      // Data stream.
    PCWSTR pszFile                   // Output file name.
    )
{
    
    IMFMediaBuffer *pHeaderBuffer = NULL;
    IMFByteStream *pWmaStream = NULL;

    DWORD cbHeaderSize = 0;
    DWORD cbWritten = 0;

    // Create output file.
    HRESULT hr = MFCreateFile(
        MF_ACCESSMODE_WRITE, 
        MF_OPENMODE_DELETE_IF_EXIST,
        MF_FILEFLAGS_NONE,
        pszFile,
        &pWmaStream
        );

    // Get the size of the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(NULL, &cbHeaderSize);
    }

    // Create a media buffer.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbHeaderSize, &pHeaderBuffer);
    }

    // Populate the media buffer with the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(pHeaderBuffer, &cbHeaderSize);
    }
 
    // Write the header contents to the byte stream for the output file.
    if (SUCCEEDED(hr))
    {
        hr = WriteBufferToByteStream(pWmaStream, pHeaderBuffer, &cbWritten);
    }

    if (SUCCEEDED(hr))
    {
        hr = pDataStream->SetCurrentPosition(0);
    }

    // Append the data stream to the file.

    if (SUCCEEDED(hr))
    {
        hr = AppendToByteStream(pDataStream, pWmaStream);
    }

    SafeRelease(&pHeaderBuffer);
    SafeRelease(&pWmaStream);

    return hr;
}

新しいファイルの ASF ヘッダー オブジェクトの書き込み