Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. Source Reader e Sink Writer foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize do Leitor de Origem e do Gravador de Separadores em vez de SDK do Windows Media Format 11, sempre que 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 Windows Media Format para criar arquivos ASF que contenham mídia digital codificada com qualquer codec escolhido. Ao usar um codec diferente de um incluído com este SDK, você deve executar as seguintes etapas.
- Codifique o conteúdo com o codec desejado.
- Localize ou crie um valor GUID para identificar o conteúdo codificado com o codec usado na etapa 1.
- 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 para o fluxo para 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 tempo de execução do SDK verificam os valores da janela de taxa de bits/buffer e soltam amostras, se necessário, para fazer com que os dados fornecidos se encaixem nesses valores. Se você definir os valores incorretamente, o arquivo não será transmitido corretamente, resultando em má reprodução.
- Para fluxos de vídeo, deve-se definir o membro biCompression da estrutura BITMAPINFOHEADER contida na estrutura WMVIDEOINFOHEADER para o valor FOURCC apropriado para o conteúdo. Esse valor deve ser igual aos primeiros quatro bytes do GUID do subtipo. Por exemplo, se biCompression seja MAKEFOURCC('T','E','S','T')=0x54455354, o GUID do subtipo começará assim: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
- Crie um objeto writer e carregue o perfil criado na etapa anterior. Para obter mais informações sobre como gravar arquivos, consulte Escrevendo arquivos ASF.
- Percorra as entradas do arquivo e atribua propriedades de entrada para cada uma como faria normalmente. Para obter mais informações sobre entradas, consulte Utilização de Entradas. Para o fluxo codificado com um codec de terceiros, defina o ponteiro da interface IWMInputMediaProps para NULL antes de chamar IWMWriter::BeginWriting.
- Use o novo perfil criado na etapa anterior para gravar o arquivo. Passe as amostras compactadas 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 amostras de fluxo compactado. Seu aplicativo de leitura também deve lidar com a descompactação de amostra para o fluxo.
Colocando fluxos MPEG-2 em ASF
Observação
Este tópico se aplica a aplicativos que usam o SDK do Windows Media Format para colocar MPEG-2 (ou outros formatos de compactação que usam quadros B) no contêiner de arquivo ASF.
O objeto writer requer que todas as amostras de entrada tenham carimbos de data/hora e pressupõe que cada amostra de entrada tenha um tempo de apresentação posterior àquele que o precedeu. Enquanto praticamente todos os vídeos não compactados e até mesmo alguns fluxos de vídeo compactados atendem 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 quadros B estão presentes, a ordem de decodificação da amostra não é a mesma que a ordem de renderização. Quando o objeto escritor encontra amostras fora de ordem, reorganiza-as na ordem "correta". Portanto, para armazenar fluxos MPEG-2 nativamente (não decodificados) em um contêiner ASF, você deve executar as seguintes etapas:
Ao escrever o ficheiro:
- Adicione uma extensão de unidade de dados de tamanho fixo (DUE) a cada amostra de entrada que abrigará uma estrutura contendo os valores reais de carimbo de data/hora MPEG de início e término para a amostra. Use -1 para esses valores se a amostra não tiver carimbo de data/hora.
- Dê ao objeto do gravador carimbos de data e hora de entrada "fictícios" que estão sempre aumentando para que ele grave as amostras no arquivo exatamente na mesma ordem em que são recebidas. Os carimbos de data/hora fictícios devem corresponder aproximadamente aos tempos reais de apresentação, conforme a média ao longo do tempo. Os carimbos de data/hora fictícios formarão a linha do tempo de busca, portanto, se divergirem em relação aos carimbos de tempo real, as operações de busca no arquivo produzirão resultados inesperados. No entanto, uma quantidade limitada de flutuação entre os tempos de amostragem não comprometerá seriamente as operações de busca.
Ao ler o ficheiro:
- Para cada amostra lida do arquivo, examine o DUE. Se contiver uma hora de início maior ou igual a zero, copie esse valor para o carimbo de data/hora da amostra de saída antes de ser entregue ao decodificador. Defina todos os outros carimbos de data/hora nas amostras de saída como NULL. No DirectShow, isso é feito chamando IMediaSample::SetTime(NULL,NULL).
Tópicos relacionados