Criar e configurar fluxos ASF

Cada arquivo ASF contém um ou mais fluxos. O objeto do Perfil ASF representa uma coleção de fluxos ASF. Para a codificação ASF, você deve criar e configurar os fluxos que deseja codificar.

Um aplicativo pode executar as seguintes tarefas com o objeto do perfil ASF:

  • Adicione ou remova um fluxo.
  • Obtenha as definições de configuração de um fluxo.
  • Configure extensões de conteúdo.
  • Adicione, remova ou modifique um objeto de exclusão mútua ASF.

Este tópico inclui as seções a seguir.

Criar um novo fluxo

Um objeto do perfil ASF deve conter definições de configuração para pelo menos um fluxo ASF. Cada fluxo é representado por um objeto de configuração de fluxo, que expõe a interface IMFASFStreamConfig. As informações no objeto de configuração de fluxo correspondem ao objeto Stream Properties e aos objetos Extended Stream Properties no cabeçalho do arquivo ASF. (Consulte Estrutura do arquivo ASF.)

Para adicionar um fluxo a um perfil ASF, execute as seguintes etapas:

  1. Crie um objeto de configuração de fluxo vazio.
  2. Configure o fluxo de acordo com os requisitos do aplicativo.
  3. Adicione o fluxo ao perfil.

Para criar um fluxo para o perfil, chame IMFASFProfile::CreateStream para criar um objeto de configuração de fluxo vazio e receber o ponteiro no parâmetro ppIStream. CreateStream precisa saber o tipo de fluxo a ser criado. Os tipos mais comuns de fluxos usados nos arquivos ASF são fluxos de áudio e vídeo. No Media Foundation, os tipos de fluxo são indicados pelo objeto de tipo de mídia que expõe a interface IMFMediaType. O principal tipo de mídia define a categoria do fluxo de mídia digital, como áudio ou vídeo. O subtipo define o formato do tipo principal. O tipo de mídia inicial definido por CreateStream pode ser alterado usando o objeto de configuração de fluxo. Para recuperar o tipo de mídia do fluxo, chame IMFASFStreamConfig::GetMediaType; ou para recuperar o tipo principal, chame IMFASFStreamConfig::GetStreamType. Para substituir o tipo de mídia inicial de um fluxo por um novo tipo de mídia configurado, chame IMFASFStreamConfig::SetMediaType.

Se um aplicativo cria um perfil a partir de um descritor de apresentação válido chamando MFCreateASFProfileFromPresentationDescriptor. A função define automaticamente os objetos de configuração de fluxo para cada um dos fluxos e os define no perfil. Os tipos de mídia de fluxo são definidos de acordo com os descritores de fluxo associados ao descritor de apresentação.

Atribuir números de fluxo

Fluxos de todos os tipos devem receber um número de fluxo. Os números de fluxo não precisam ser sequenciais, mas devem estar no intervalo de 1 a 127. Para atribuir números de fluxo, chame IMFASFStreamConfig::SetStreamNumber. Para obter a chamada de número de fluxo, IMFASFStreamConfig::GetStreamNumber.

Observação

Um número de fluxo é diferente de um índice de fluxo, que você usa ao obter fluxos em um perfil usando IMFASFProfile::GetStream. O índice de fluxo é um número atribuído ao fluxo pelo objeto de perfil. Os índices de fluxo variam entre 0 e um a menos do que o número de fluxos recuperados por IMFASFProfile::GetStreamCount. Também é possível obter um fluxo do perfil por número de fluxo chamando IMFASFProfile::GetStreamByNumber.

 

Definir valores de bucket com vazamento

Cada objeto de configuração de fluxo que representa um fluxo deve ter parâmetros de bucket com vazamento, taxa de bits e valores de janela de buffer associados.

Esses valores estão disponíveis para o aplicativo por meio dos atributos MF_ASFSTREAMCONFIG_LEAKYBUCKET1 e MF_ASFSTREAMCONFIG_LEAKYBUCKET2. Para codificação de arquivo, os valores reais dependem do tipo de codificação e são decididos pelo codificador. Se você já tiver um codificador configurado e o tipo de saída estiver definido no codificador, o aplicativo deverá consultar o codificador para obter os parâmetros de bucket com vazamento e definir os valores nesses atributos.

Se você estiver usando os componentes da camada de pipeline e configurando os fluxos para o coletor de mídia ASF, muito provavelmente, não terá um codificador configurado. Nesse caso, consulte as negociações do tipo pós-mídia do codificador e defina o valor atualizado na propriedade MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET do repositório de propriedades do coletor de mídia ASF. O repositório de propriedades de codificação é recuperado por meio do objeto ContentInfo associado ao perfil. Os valores atualizados são refletidos automaticamente nos valores de atributo de bucket com vazamento do fluxo. Para obter informações gerais sobre buckets com vazamento e como obter o valor do bucket com vazamento do codificador, consulte o Modelo de buffer de bucket com vazamento.

Extensões de conteúdo

Os dados de mídia para os fluxos são adicionados ao objeto Data do ASF como Amostras de mídia pelo Multiplexador do ASF. Essas amostras de mídia podem conter dados de extensão de conteúdo: dados de código de tempo SMPTE, taxa de proporção de pixel não quadrado, duração da amostra e, se a amostra contiver, um quadro chave de vídeo. Para obter uma lista dos tipos compatíveis de extensão de conteúdo, consulte GUIDs de extensão de conteúdo ASF.

Um fluxo deve ser configurado para aceitar a extensão de conteúdo para que, durante a geração da amostra, o multiplexador possa adicionar os dados suplementares a cada amostra desse fluxo.

Para obter o número total de extensões de conteúdo definidas no fluxo, chame IMFASFStreamConfig::GetPayloadExtensionCount e enumere a lista chamando IMFASFStreamConfig::GetPayloadExtension. Para adicionar a extensão de conteúdo do fluxo, chame IMFASFStreamConfig::AddPayloadExtension. Isso adicionará dados suplementares a amostras de mídias individuais geradas para o fluxo.

Para remover extensões de conteúdo existentes associadas ao fluxo, chame IMFASFStreamConfig::RemoveAllPayloadExtensions.

Adicionar um fluxo ao perfil

Após a configuração de um fluxo, chame IMFASFProfile::SetStream para adicionar o fluxo ao perfil.

Para remover um fluxo existente no perfil, chame IMFASFProfile::RemoveStream.

Para definir o perfil configurado no objeto ContentInfo, chame IMFASFContentInfo::SetProfile. Se fizer alterações em um fluxo existente, adicione-o novamente ao perfil e defina o perfil no objeto ContentInfo.

Perfil ASF

Suporte a ASF no Media Foundation

Componentes ASF de WMContainer