Generación de un nuevo objeto de encabezado ASF

Para convertir la información contenida en el objeto ContentInfo a un formato de objeto de encabezado ASF binario, la aplicación debe llamar a IMFASFContentInfo::GenerateHeader. Esta llamada debe realizarse después de generar los paquetes de datos y el objeto ContentInfo contiene información actualizada. GenerateHeader devuelve un puntero a un búfer multimedia que contiene la información de encabezado en el formato válido. Después, la aplicación puede escribir los datos, a los que apunta el búfer multimedia, al principio de un nuevo archivo ASF.

Para escribir un nuevo objeto header mediante el objeto ContentInfo

  1. Llame a MFCreateASFContentInfo para crear un objeto ContentInfo vacío.

  2. Llame a IMFASFContentInfo::SetProfile para proporcionar el objeto de perfil al objeto ContentInfo. Para obtener información sobre cómo crear perfiles, vea Crear un perfil de ASF.

  3. Llame a IMFASFContentInfo::GenerateHeader y pase NULL en el parámetro pIHeader y reciba el tamaño del objeto ContentInfo rellenado en el parámetro pcbHeader . La aplicación puede usar este valor para asignar memoria o el búfer multimedia que contendrá el objeto header.

    El tamaño del encabezado recibido incluye el tamaño de relleno, que se ajusta en función del tamaño real de los objetos de encabezado. El tamaño máximo de los objetos de encabezado es de 10 MB. Si el tamaño supera este valor, GenerateHeader produce el error MF_E_ASF_INVALIDDATA.

  4. Llame a MFCreateMemoryBuffer para crear un búfer multimedia del tamaño recibido en el paso 3.

  5. Vuelva a llamar a GenerateHeader para generar el nuevo objeto de encabezado ASF desde el objeto ContentInfo en el búfer multimedia creado en el paso 4.

    La longitud de los datos del búfer multimedia se actualiza y el nuevo tamaño se devuelve en el parámetro pcbHeader .

  6. Escriba el contenido del búfer multimedia al principio del archivo. La aplicación puede usar la secuencia de bytes para realizar la operación de escritura. Para obtener código de ejemplo, vea IMFByteStream::Write.

Ejemplo

En el código de ejemplo siguiente se muestra cómo crear un objeto ContentInfo y generar un búfer multimedia para almacenar el nuevo objeto header. Para obtener un ejemplo completo que usa este código, vea Tutorial: Copia de secuencias ASF de un archivo a otro.

//-------------------------------------------------------------------
// 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;
}

Escribir un objeto de encabezado ASF para un nuevo archivo