既存のファイルの ASF ヘッダー オブジェクトの読み取り

ASF ContentInfo オブジェクトには、メディア ファイルの ASF ヘッダー オブジェクトを表す情報が格納されます。 既存の ASF ファイルを読み取って解析するには、設定された ContentInfo オブジェクトが必要です。

MFCreateASFContentInfo 関数を呼び出して ContentInfo オブジェクトを作成した後、アプリケーションは、読み取る ASF ファイルのヘッダー情報を使用して初期化する必要があります。 オブジェクトを設定するには、 IMFASFContentInfo::P arseHeader を呼び出します。

ParseHeader には、ASF ファイルの Header オブジェクトを含むメディア バッファーが必要です。 1 つのオプションは、メディア バッファーに Header オブジェクトを入力してファイルのバイト ストリームを作成し、バイト ストリームからメディア バッファーに最初の 30 バイトのデータを読み取る方法です。 その後、ヘッダー オブジェクトの最初の 24 バイトを IMFASFContentInfo::GetHeaderSize メソッドに渡すことで、サイズを取得できます。 サイズを取得した後、メディア バッファー内のヘッダー オブジェクト全体を読み取り、 ParseHeader に渡すことができます。 メソッドは、 cbOffsetWithinHeader パラメーターで指定されたメディア バッファーの先頭からのオフセットから解析を開始します。

次のコード例では、バイト ストリームに含まれる既存の ASF ファイルを読み取るための ContentInfo オブジェクトを作成および初期化します。 まず、バイト ストリームからデータを読み取り、データを保持するメディア バッファーを割り当てるヘルパー関数を定義します。

// Read the ASF Header Object from a byte stream and return a pointer to the 
// populated ASF ContentInfo object.
//
// The current read position of the byte stream must be at the start of the
// ASF Header Object.

HRESULT CreateContentInfo(IMFByteStream *pStream, 
    IMFASFContentInfo **ppContentInfo)
{
    const DWORD MIN_ASF_HEADER_SIZE = 30;
    
    QWORD cbHeader = 0;
    DWORD cbBuffer = 0;

    IMFASFContentInfo *pContentInfo = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    // Create the ASF ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
    
    // Read the first 30 bytes to find the total header size.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(MIN_ASF_HEADER_SIZE, &pBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer,MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GetHeaderSize(pBuffer, &cbHeader);
    }

    // Pass the first 30 bytes to the ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, 0);
    }

    SafeRelease(&pBuffer);

    if (SUCCEEDED(hr))
    {
        cbBuffer = (DWORD)(cbHeader - MIN_ASF_HEADER_SIZE);

        hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);
    }

    // Read the rest of the header and finish parsing the header.
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer, cbBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        // Return the pointer to the caller.
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();
    }
    SafeRelease(&pBuffer);
    SafeRelease(&pContentInfo);
    return hr;
} 

次の例では、バイト ストリームから ASF ヘッダー オブジェクトを読み取り、ASF ContentInfo オブジェクトを設定します。

// Read the ASF Header Object from a byte stream and return a pointer to the 
// populated ASF ContentInfo object.
//
// The current read position of the byte stream must be at the start of the
// ASF Header Object.

HRESULT CreateContentInfo(IMFByteStream *pStream, 
    IMFASFContentInfo **ppContentInfo)
{
    const DWORD MIN_ASF_HEADER_SIZE = 30;
    
    QWORD cbHeader = 0;
    DWORD cbBuffer = 0;

    IMFASFContentInfo *pContentInfo = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    // Create the ASF ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
    
    // Read the first 30 bytes to find the total header size.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(MIN_ASF_HEADER_SIZE, &pBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer,MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GetHeaderSize(pBuffer, &cbHeader);
    }

    // Pass the first 30 bytes to the ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, 0);
    }

    SafeRelease(&pBuffer);

    if (SUCCEEDED(hr))
    {
        cbBuffer = (DWORD)(cbHeader - MIN_ASF_HEADER_SIZE);

        hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);
    }

    // Read the rest of the header and finish parsing the header.
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer, cbBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        // Return the pointer to the caller.
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();
    }
    SafeRelease(&pBuffer);
    SafeRelease(&pContentInfo);
    return hr;
} 

注意

これらの例では、 SafeRelease 関数を使用してインターフェイス ポインターを解放します。

 

ASF ContentInfo オブジェクト

ASF ヘッダー オブジェクト

Media Foundation での ASF サポート

ASF ヘッダー オブジェクトからの情報の取得