共用方式為


產生新的 ASF 標頭物件

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

使用 ContentInfo 物件寫入新的 Header 物件

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

  2. 呼叫 IMFASFContentInfo::SetProfile ,將設定檔物件提供給 ContentInfo 物件。 如需建立設定檔的相關資訊,請參閱 建立 ASF 設定檔

  3. 呼叫IMFASFContentInfo::GenerateHeader,並在pIHeader參數中傳遞Null,並在azureHeader參數中接收填入的 ContentInfo 物件大小。 應用程式可以使用此值來配置記憶體或將包含 Header 物件的媒體緩衝區。

    收到的標頭大小包括填補大小,會根據標頭物件的實際大小進行調整。 標頭物件的大小上限為 10 MB。 如果大小超過此值, GenerateHeader 就會失敗,並出現MF_E_ASF_INVALIDDATA錯誤。

  4. 呼叫 MFCreateMemoryBuffer ,以在步驟 3 中建立已接收大小的媒體緩衝區。

  5. 再次呼叫 GenerateHeader ,從步驟 4 所建立媒體緩衝區的 ContentInfo 物件產生新的 ASF 標頭物件。

    媒體緩衝區中的資料長度會更新,而新的大小則會在 azureHeader 參數中傳回。

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