產生新的 ASF 標頭物件
若要將 ContentInfo 物件中包含的資訊轉換成二進位 ASF 標頭物件格式,應用程式必須呼叫 IMFASFContentInfo::GenerateHeader。 產生數據封包之後,必須進行此呼叫,ContentInfo 物件包含更新的資訊。 GenerateHeader 傳回一個指標,指向包含有效格式的標頭資訊的媒體緩衝區。 接著,應用程式可以在新的 ASF 檔案開頭寫入媒體緩衝區所指向的數據。
若要使用 ContentInfo 物件撰寫新的 Header 物件
呼叫 MFCreateASFContentInfo 來建立空的 ContentInfo 物件。
呼叫 IMFASFContentInfo::SetProfile,將配置文件物件提供給 ContentInfo 物件。 如需建立設定檔的詳細資訊,請參閱 建立 ASF 設定檔。
呼叫 IMFASFContentInfo::GenerateHeader,並在 pIHeader 參數中傳遞 NULL,接著接收在 pcbHeader 參數中填入的 ContentInfo 物件大小。 應用程式可以使用此值來配置記憶體或將包含 Header 對象的媒體緩衝區。
收到的標頭大小包含填補大小,會根據標頭對象的實際大小進行調整。 標頭物件的大小上限為 10 MB。 如果大小超過此值,GenerateHeader 失敗,併發生MF_E_ASF_INVALIDDATA錯誤。
呼叫 MFCreateMemoryBuffer,以在步驟 3 中建立接收大小的媒體緩衝區。
再次呼叫 GenerateHeader,從步驟 4 所建立媒體緩衝區的 ContentInfo 物件產生新的 ASF 標頭物件。
媒體緩衝區中的數據長度會更新,並在 參數中回傳新的尺寸。
在檔案開頭寫入媒體緩衝區的內容。 應用程式可以使用位元組數據流來執行寫入作業。 如需範例程式代碼,請參閱 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;
}
相關主題