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