Para gravar exemplos
[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.]
Quando você identificou e configurou as entradas para o arquivo que está gravando, pode começar a passar amostras para o gravador. Você deve passar exemplos em ordem de tempo de apresentação, se possível, para tornar o processo de gravação mais eficiente.
Antes de passar os exemplos, você deve definir o gravador para aceitá-los chamando IWMWriter::BeginWriting.
Para passar um exemplo para o gravador, execute as seguintes etapas:
- Aloque um buffer e recupere um ponteiro para a interface INSSBuffer chamando IWMWriter::AllocateSample.
- Recupere o endereço do buffer criado na etapa 1 chamando INSSBuffer::GetBuffer.
- Copie seus dados de exemplo para o local do buffer, certificando-se de que o exemplo passado caberá no buffer alocado. Você pode usar qualquer função de cópia de memória para copiar seus dados. Uma opção comum é o memcpy, que está incluído na biblioteca de tempo de execução C padrão.
- Atualize a quantidade de dados usada no buffer para refletir o tamanho real da amostra chamando INSSBuffer::SetLength.
- Passe a interface do buffer para o gravador junto com o número de entrada e o tempo de exemplo usando o método IWMWriter::WriteSample . Todos os exemplos de áudio de uma entrada representam a mesma duração do conteúdo, para que você possa calcular o tempo de exemplo adicionando a duração da amostra a um total em execução. Para vídeo, você precisa calcular o tempo com base na taxa de quadros.
WriteSample funciona de forma assíncrona e pode não terminar de gravar os dados do buffer antes que seu aplicativo esteja pronto para chamar o método novamente. Portanto, é importante chamar AllocateSample uma vez para cada chamada para WriteSample. No entanto, você pode liberar a interface INSSBuffer imediatamente após chamar WriteSample.
Quando terminar de passar amostras, chame IWMWriter::EndWriting.
Nota É importante que exemplos de todos os fluxos no arquivo sejam passados para o gravador em sincronização entre si. Ou seja, sempre que possível, você deve passar amostras para o gravador em ordem de tempo de apresentação dentro da tolerância de sincronização especificada em IWMWriterAdvanced::SetSyncTolerance. Os melhores resultados são obtidos quando os dados são entregues a cada fluxo em unidades de um segundo ou menos.
Os fluxos também devem terminar aproximadamente ao mesmo tempo. Por exemplo, você não deve escrever um arquivo com um fluxo de áudio com 45 segundos de duração e um fluxo de vídeo com 50 segundos de duração. Se você codificar esse arquivo com entradas não filtradas, alguns dos dados de áudio no final do fluxo serão descartados (mesmo que seja o fluxo mais curto). Para fazer a codificação do arquivo funcionar, você deve adicionar 5 segundos de silêncio à entrada de áudio para que um fluxo não termine vários segundos antes do outro. Não é necessário que tipos de fluxo com exemplos intermitentes, como fluxos de texto ou imagem, sejam adicionados dessa forma. Os fluxos de comando de script também devem seguir todas essas regras.
Tópicos relacionados