生成新的 ASF 标头对象

若要将 ContentInfo 对象中包含的信息转换为二进制 ASF 标头对象格式,应用程序必须调用 IMFASFContentInfo::GenerateHeader。 必须在生成数据包且 ContentInfo 对象包含更新的信息之后进行此调用。 GenerateHeader 返回指向媒体缓冲区的指针,该缓冲区包含有效格式的标头信息。 然后,应用程序可以在新 ASF 文件的开头写入媒体缓冲区指向的数据。

使用 ContentInfo 对象编写新的标头对象

  1. 调用 MFCreateASFContentInfo 创建一个空的 ContentInfo 对象。

  2. 调用 IMFASFContentInfo::SetProfile 将配置文件对象提供给 ContentInfo 对象。 有关创建配置文件的信息,请参阅 创建 ASF 配置文件

  3. 调用 IMFASFContentInfo::GenerateHeader 并在 pIHeader 参数中传递 NULL,并接收已填充的 contentInfo 对象的大小。 应用程序可以使用此值来分配将包含标头对象的内存或媒体缓冲区。

    收到的标头大小包括填充大小,根据标头对象的实际大小进行调整。 标头对象的最大大小为 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 标头对象