Partilhar via


Para criar arquivos ASF usando codecs de terceiros

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador de Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador de Coletor em vez do SDK do Windows Media Format 11, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Você pode usar o SDK do Formato de Mídia do Windows para criar arquivos ASF que contêm mídia digital codificada com qualquer codec escolhido. Ao usar um codec diferente de um incluído com esse SDK, você deve executar as etapas a seguir.

  1. Codificar o conteúdo com o codec desejado.
  2. Localize ou crie um valor GUID para identificar o conteúdo codificado com o codec usado na etapa 1.
  3. Crie um novo perfil ou modifique um perfil existente para uso com o conteúdo codificado.
    • Crie um fluxo para o conteúdo codificado com o tipo principal apropriado. Para obter mais informações sobre os principais tipos de mídia, consulte Tipos de mídia. Use o GUID identificado na etapa 2 como o subtipo de mídia.
    • Defina a taxa de bits e a janela de buffer do fluxo como valores que não resultarão em estouro de buffer. Você deve ser capaz de obter esses valores do codec no momento da codificação. Os componentes de runtime do SDK marcar os valores da janela de buffer/taxa de bits e descartar exemplos, se necessário, para que os dados fornecidos se ajustem a esses valores. Se você definir os valores incorretamente, o arquivo não será transmitido corretamente, resultando em uma reprodução ruim.
    • Para fluxos de vídeo, você deve definir o membro biCompression da estrutura BITMAPINFOHEADER contida na estrutura WMVIDEOINFOHEADER como o valor FOURCC apropriado para o conteúdo. Esse valor deve ser igual aos quatro primeiros bytes do GUID do subtipo. Por exemplo, se biCompression for MAKEFOURCC('T','E','S','T')=0x54455354, o GUID do subtipo começará assim: 54455354-XXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXXXX.
  4. Crie um objeto gravador e carregue o perfil criado na etapa anterior. Para obter mais informações sobre como gravar arquivos, consulte Escrevendo arquivos ASF.
  5. Faça um loop pelas entradas do arquivo e atribua propriedades de entrada para cada uma como você normalmente faria. Para obter mais informações sobre entradas, consulte Trabalhando com entradas. Para o fluxo codificado com um codec de terceiros, defina o ponteiro da interface IWMInputMediaProps como NULL antes de chamar IWMWriter::BeginWriting.
  6. Use o novo perfil criado na etapa anterior para gravar o arquivo. Passe os exemplos compactados usando IWMWriterAdvanced::WriteStreamSample em vez de IWMWriter::WriteSample. Para vídeo, você deve especificar quais exemplos são quadros-chave passando WM_SF_CLEANPOINT como o parâmetro dwFlags .

Para processar e descompactar o fluxo codificado com um codec de terceiros, você deve ler exemplos de fluxo compactados. Seu aplicativo de leitura também deve manipular a descompactação de exemplo para o fluxo.

Colocando fluxos MPEG-2 no ASF

Observação

Este tópico se aplica a aplicativos que usam o SDK de Formato de Mídia do Windows para colocar MPEG-2 (ou outros formatos de compactação que usam quadros B) no contêiner de arquivos ASF.

 

O objeto gravador requer que todos os exemplos de entrada tenham carimbos de data/hora e pressupõe que cada exemplo de entrada tenha um tempo de apresentação posterior ao que o precedeu. Embora praticamente todos os vídeos descompactados e até mesmo alguns fluxos de vídeo compactados atendam a essas condições, os fluxos MPEG-2 não. No MPEG-2, nem todas as amostras têm carimbo de data/hora e, quando os quadros B estão presentes, a ordem de decodificação de exemplo não é a mesma que a ordem de renderização. Quando o objeto gravador encontra exemplos fora de ordem, ele os reorganiza na ordem "correta". Portanto, para armazenar fluxos MPEG-2 nativamente (não decodificados) em um contêiner do ASF, você deve executar as seguintes etapas:

Ao gravar o arquivo:

  1. Adicione uma DUE (extensão de unidade de dados) de tamanho fixo a cada exemplo de entrada que conterá uma estrutura que contém os valores reais de hora de início e hora de parada do carimbo de data/hora do MPEG para o exemplo. Use -1 para esses valores se o exemplo não tiver carimbo de data/hora.
  2. Dê ao objeto gravador carimbos de hora de entrada "fictícios" que estão sempre aumentando para que ele escreva os exemplos no arquivo exatamente na mesma ordem em que são recebidos. Os carimbos de data/hora fictícios devem corresponder aproximadamente aos tempos reais de apresentação, conforme média ao longo do tempo. Os carimbos de data/hora fictícios formarão o linha do tempo de busca, portanto, se divergirem em relação aos carimbos em tempo real, as operações de busca no arquivo produzirão resultados inesperados. No entanto, uma quantidade limitada de tremulação entre os tempos de exemplo não afetará seriamente as operações de busca.

Ao ler o arquivo:

  • Para cada exemplo lido do arquivo, examine o DUE. Se ele contiver uma hora de início maior ou igual a zero, copie esse valor para o carimbo de data/hora do exemplo de saída antes de ser entregue ao decodificador. Defina todos os outros carimbos de data/hora nos exemplos de saída como NULL. No DirectShow, isso é feito chamando IMediaSample::SetTime(NULL,NULL).

Conteúdo de buffer

IWMWriter Interface

IWMWriterAdvanced Interface

Para entregar amostras compactadas com o leitor assíncrono

Para recuperar exemplos de fluxo com o leitor síncrono

WMVIDEOINFOHEADER

Trabalhando com perfis

Gravando arquivos ASF