共用方式為


產生新的 ASF 標頭物件

若要將 ContentInfo 物件中包含的資訊轉換成二進位 ASF 標頭物件格式,應用程式必須呼叫 IMFASFContentInfo::GenerateHeader。 產生數據封包之後,必須進行此呼叫,ContentInfo 物件包含更新的資訊。 GenerateHeader 傳回一個指標,指向包含有效格式的標頭資訊的媒體緩衝區。 接著,應用程式可以在新的 ASF 檔案開頭寫入媒體緩衝區所指向的數據。

若要使用 ContentInfo 物件撰寫新的 Header 物件

  1. 呼叫 MFCreateASFContentInfo 來建立空的 ContentInfo 物件。

  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 標頭物件。

    媒體緩衝區中的數據長度會更新,並在 參數中回傳新的尺寸。

  6. 在檔案開頭寫入媒體緩衝區的內容。 應用程式可以使用位元組數據流來執行寫入作業。 如需範例程式代碼,請參閱 IMFByteStream::Write

下列範例程式代碼示範如何建立 ContentInfo 物件,併產生媒體緩衝區來儲存新的 Header 物件。 如需使用此程式碼的完整範例,請參閱 教學課程:將 ASF 數據流從一個檔案複製到另一個檔案

//-------------------------------------------------------------------
// 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 標頭物件