生成新的 ASF 标头对象
若要将 ContentInfo 对象中包含的信息转换为二进制 ASF 标头对象格式,应用程序必须调用 IMFASFContentInfo::GenerateHeader。 必须在生成数据包且 ContentInfo 对象包含更新的信息之后进行此调用。 GenerateHeader 返回指向媒体缓冲区的指针,该缓冲区包含有效格式的标头信息。 然后,应用程序可以在新 ASF 文件的开头写入媒体缓冲区指向的数据。
使用 ContentInfo 对象编写新的标头对象
调用 MFCreateASFContentInfo 创建一个空的 ContentInfo 对象。
调用 IMFASFContentInfo::SetProfile 将配置文件对象提供给 ContentInfo 对象。 有关创建配置文件的信息,请参阅 创建 ASF 配置文件。
调用 IMFASFContentInfo::GenerateHeader 并在 pIHeader 参数中传递 NULL,并接收已填充的 contentInfo 对象的大小。 应用程序可以使用此值来分配将包含标头对象的内存或媒体缓冲区。
收到的标头大小包括填充大小,根据标头对象的实际大小进行调整。 标头对象的最大大小为 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;
}
相关主题