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
Chame MFCreateASFContentInfo para criar um objeto ContentInfo vazio.
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.
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.
Chame MFCreateMemoryBuffer para criar um buffer de mídia do tamanho recebido na etapa 3.
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 .
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;
}
Tópicos relacionados