Partilhar via


Gerando um novo objeto de cabeçalho ASF

Para converter as informações contidas no objeto ContentInfo em um formato de objeto de cabeçalho ASF binário, o aplicativo deve chamar IMFASFContentInfo::GenerateHeader. Essa chamada deve ser feita depois que os pacotes de dados são gerados e o objeto ContentInfo contém informações atualizadas. GenerateHeader retorna um ponteiro para um buffer de mídia que contém as informações de cabeçalho no formato válido. Em seguida, o aplicativo pode gravar os dados, apontados pelo buffer de mídia, no início de um novo arquivo ASF.

Para escrever um novo objeto header usando o objeto ContentInfo

  1. Chame MFCreateASFContentInfo para criar um objeto ContentInfo vazio.

  2. Chame IMFASFContentInfo::SetProfile para fornecer o objeto de perfil para o objeto ContentInfo. Para obter informações sobre como criar perfis, consulte Criando um perfil ASF.

  3. Chame IMFASFContentInfo::GenerateHeader e passe NULL no parâmetro pIHeader e receba o tamanho do objeto ContentInfo preenchido no parâmetro pcbHeader . O aplicativo pode usar esse valor para alocar memória ou o buffer de mídia que conterá o Objeto Header.

    O tamanho do cabeçalho recebido inclui o tamanho do preenchimento, que é ajustado dependendo do tamanho real dos objetos de cabeçalho. O tamanho máximo dos objetos de cabeçalho é de 10 MB. Se o tamanho exceder esse valor, GenerateHeader falhará com o erro MF_E_ASF_INVALIDDATA.

  4. Chame MFCreateMemoryBuffer para criar um buffer de mídia do tamanho recebido na etapa 3.

  5. Chame GenerateHeader novamente para gerar o novo objeto de cabeçalho ASF do objeto ContentInfo no buffer de mídia criado na etapa 4.

    O comprimento dos dados no buffer de mídia é atualizado e o novo tamanho é retornado no parâmetro pcbHeader .

  6. Escreva o conteúdo do buffer de mídia no início do arquivo. O aplicativo pode usar o fluxo de bytes para executar a operação de gravação. Para obter um código de exemplo, consulte IMFByteStream::Write.

Exemplo

O código de exemplo a seguir mostra como criar um objeto ContentInfo e gerar um buffer de mídia para armazenar o novo Objeto header. Para obter um exemplo completo que usa esse código, consulte Tutorial: Copiando Fluxos ASF de um arquivo para outro.

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

Escrevendo um objeto de cabeçalho ASF para um novo arquivo