Adicionando informações de fluxo ao coletor de arquivos ASF
O coletor de arquivos ASF é uma implementação do IMFMediaSink fornecida pelo Media Foundation que um aplicativo pode usar para arquivar dados de mídia ASF em um arquivo. Para obter informações sobre o modelo de objeto e o uso geral dos Coletores de Mídia do ASF, consulte Coletores de Mídia ASF.
Depois de instanciar o coletor de arquivos, ele deve ser configurado antes de criar a topologia. O coletor de arquivos precisa saber sobre os fluxos no arquivo de saída, as informações do modo de codificação e os metadados. Este tópico descreve o processo de adição de fluxo no coletor de arquivos.
Adicionando fluxos no coletor de arquivos ASF
O coletor de arquivos deve conhecer os fluxos de saída e suas propriedades para que possa gerar amostras de saída adequadamente e adicioná-las ao arquivo ASF de saída. Essas configurações são gravadas no objeto de cabeçalho ASF final.
Para definir informações de fluxo, você deve ter uma referência ao objeto ContentInfo do coletor de arquivos. Para obter informações, consulte Criando o coletor de arquivos ASF.
O procedimento a seguir resume as etapas gerais para configurar o fluxo usando o objeto de perfil ASF.
Para configurar informações de fluxo no coletor de arquivos ASF
Crie um objeto de perfil ASF chamando MFCreateASFProfile.
Para cada fluxo no arquivo de saída, crie um tipo de mídia para o fluxo de destino a ser adicionado no coletor de arquivos. O tipo de mídia deve ser compatível com os tipos de saída compatíveis com os codificadores do Windows Media.
Para obter informações sobre como adicionar fluxos de áudio ao perfil, consulte Criando fluxos de áudio para codificação ASF.
Para obter informações sobre como adicionar fluxos de vídeo ao perfil, consulte Criando fluxos de vídeo para codificação ASF.
Crie fluxos com base nos tipos de mídia criados na etapa 2 chamando IMFASFProfile::CreateStream.
Atribua um número de fluxo para o fluxo recém-criado chamando o ponteiro da interface IMFASFStreamConfig recebido na etapa 3.
Opcionalmente, configure o fluxo com as seguintes informações:
- Parâmetros de bucket com vazamento definindo os atributos: MF_ASFSTREAMCONFIG_LEAKYBUCKET1 ou MF_ASFSTREAMCONFIG_LEAKYBUCKET2
- Extensão de conteúdo, exclusão mútua chamando métodos IMFASFStreamConfig .
Opcionalmente, defina o tamanho do pacote de dados para o perfil definindo atributos MF_ASFPROFILE_MINPACKETSIZE e MF_ASFPROFILE_MAXPACKETSIZE . O perfil do ASF expõe a interface IMFAttributes , à qual um aplicativo pode obter referência chamando IMFASFProfile::QueryInterface.
Defina informações de codificação para o fluxo no coletor de arquivos. Discutido em Definindo propriedades no coletor de arquivos.
Adicione o fluxo ao perfil chamando IMFASFProfile::SetStream.
Associe o perfil ao objeto ContentInfo chamando IMFASFContentInfo::SetProfile.
Para modificar um fluxo existente, o aplicativo pode obter uma referência à interface IMFASFStreamConfig do fluxo e reconfigurá-lo de acordo com os requisitos. Para adicionar ou remover fluxos, o aplicativo deve chamar IMFASFProfile::RemoveStream. Para aplicar essas alterações, transmitir modificações ou remoção, você deve definir o perfil novamente no objeto ContentInfo. Isso substitui o perfil existente que já está associado ao objeto ContentInfo.
//-------------------------------------------------------------------
// CreateVideoStream
// Create an video stream and add it to the profile.
//
// pProfile: A pointer to the ASF profile.
// wStreamNumber: Stream number to assign for the new stream.
// pType: A pointer to the source's video media type.
//-------------------------------------------------------------------
HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
if (!pProfile)
{
return E_INVALIDARG;
}
if (wStreamNumber < 1 || wStreamNumber > 127 )
{
return MF_E_INVALIDSTREAMNUMBER;
}
HRESULT hr = S_OK;
IMFMediaType* pVideoType = NULL;
IMFASFStreamConfig* pVideoStream = NULL;
UINT32 dwBitRate = 0;
//Create a new video type from the source type
hr = CreateCompressedVideoType(pType, &pVideoType);
if (FAILED(hr))
{
goto done;
}
//Create a new stream with the video type
hr = pProfile->CreateStream(pVideoType, &pVideoStream);
if (FAILED(hr))
{
goto done;
}
//Set a valid stream number
hr = pVideoStream->SetStreamNumber(wStreamNumber);
if (FAILED(hr))
{
goto done;
}
//Add the stream to the profile
hr = pProfile->SetStream(pVideoStream);
if (FAILED(hr))
{
goto done;
}
wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);
done:
SafeRelease(&pVideoStream);
SafeRelease(&pVideoType);
return hr;
}
Enumerando coletores de fluxo
Para cada fluxo no perfil do qual o objeto ContentInfo está ciente, o coletor de arquivos ASF cria e adiciona um coletor de fluxo que contém todas as propriedades do fluxo codificado. O coletor de arquivos ASF foi projetado para conter fluxos fixos. Isso significa que você não pode adicionar ou remover fluxos chamando IMFMediaSink::AddStreamSink ou IMFMediaSink::RemoveStreamSink. Essas chamadas no coletor de arquivos falham com o código de erro MF_E_STREAMSINKS_FIXED. Adicionar ou remover fluxos no perfil não adiciona nem remove automaticamente os coletores de fluxo no coletor de arquivos. Você deve descartar a instância existente do arquivo e recriá-la com novas informações de fluxo se os fluxos no perfil tiverem sido alterados.
O procedimento a seguir resume as etapas gerais para enumerar coletores de fluxo no coletor de arquivos ASF.
Para enumerar coletores de fluxo
Chame IMFMediaSink::GetStreamSinkCount para obter o número total de coletores de fluxo no coletor de arquivos ASF.
Faça um loop pelos coletores de fluxo e obtenha uma referência à interface GetStreamSinkByIndex do coletor de fluxo.
-ou-
Chame IMFMediaSink::GetStreamSinkById para obter o coletor de fluxo especificando o número do fluxo. Cada coletor de fluxo é identificado com o número de fluxo definido durante a criação do fluxo no perfil.
Se você estiver criando uma topologia parcial para codificar um arquivo de mídia, deverá adicionar o coletor de arquivos à topologia como um nó de topologia de saída. Você pode fazer isso especificando cada coletor de vapor no coletor de arquivos ou definindo o objeto de ativação do coletor de arquivos e os identificadores do coletor de fluxo. Para obter mais informações e exemplo de código, consulte Criando nós de saída.
Tópicos relacionados