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 o Leitor de Origem e o Gravador de Destino em vez do 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.]
Quando tiveres identificado e configurado as entradas para o ficheiro que estás a escrever, podes começar a passar amostras para o gravador. Você deve passar amostras em ordem de tempo de apresentação, se possível, para tornar o processo de escrita mais eficiente.
Antes de passar quaisquer amostras, você deve configurar o gravador para aceitá-las 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 os dados de amostra para a localização do buffer, certificando-se de que a amostra passada encaixará no buffer alocado. Você pode usar qualquer função de cópia de memória para copiar seus dados. Uma escolha comum é o memcpy, que está incluído na biblioteca de tempo de execução C padrão.
- Atualize a quantidade de dados usados no buffer para refletir o tamanho real da amostra chamando INSSBuffer::SetLength.
- Passe a interface do buffer para o escritor junto com o número de entrada e o tempo de amostra usando o método IWMWriter::WriteSample. Todas as amostras de áudio para uma entrada representam a mesma duração do conteúdo, para que você possa calcular o tempo da amostra 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 transferir amostras, chame IWMWriter::EndWriting.
Nota É importante que as amostras de todos os fluxos no arquivo sejam passadas para o gravador sincronizadas umas com as outras. Ou seja, sempre que possível, deverás passar amostras para o escritor em ordem de tempo de apresentação, respeitando a tolerância de sincronização especificada em IWMWriterAdvanced::SetSyncTolerance. Os melhores resultados são alcançados 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 gravar um arquivo com um fluxo de áudio com 45 segundos de duração e um fluxo de vídeo com 50 segundos. Se você codificar tal arquivo com entradas inalteradas, 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 amostras intermitentes, como fluxos de texto ou imagem, sejam acolchoados dessa maneira. Os fluxos de comandos de script também devem seguir todas essas regras.
Tópicos relacionados