Para escribir ejemplos
[La característica asociada a esta página, WINDOWS Media Format 11 SDK, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. Lector de origen y escritor receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector fuente y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Cuando haya identificado y configurado las entradas del archivo que está escribiendo, puede empezar a pasar ejemplos al escritor. Debe pasar muestras en el orden en tiempo de presentación, si es posible, para que el proceso de escritura sea más eficaz.
Antes de pasar los ejemplos, debe establecer el escritor para que los acepte llamando a IWMWriter::BeginWriting.
Para pasar un ejemplo al escritor, realice los pasos siguientes:
- Asigne un búfer y recupere un puntero a la interfaz INSSBuffer mediante una llamada a IWMWriter::AllocateSample.
- Recupere la dirección del búfer creado en el paso 1 llamando a INSSBuffer::GetBuffer.
- Copie los datos de ejemplo en la ubicación del búfer y asegúrese de que la muestra pasada cabe en el búfer asignado. Puede usar cualquier función de copia de memoria para copiar los datos. Una opción común es memcpy, que se incluye en la biblioteca en tiempo de ejecución de C estándar.
- Actualice la cantidad de datos utilizados en el búfer para reflejar el tamaño real del ejemplo mediante una llamada a INSSBuffer::SetLength.
- Pase la interfaz de búfer al escritor junto con el número de entrada y el tiempo de ejemplo mediante el método IWMWriter::WriteSample . Todas las muestras de audio de una entrada representan la misma duración del contenido, por lo que puede calcular el tiempo de muestra agregando la duración de la muestra a un total en ejecución. En el caso del vídeo, debe calcular el tiempo en función de la velocidad de fotogramas.
WriteSample funciona de forma asincrónica y es posible que no termine de escribir los datos del búfer antes de que la aplicación esté lista para llamar al método de nuevo. Por lo tanto, es importante llamar a AllocateSample una vez para cada llamada a WriteSample. Sin embargo, puede liberar la interfaz INSSBuffer inmediatamente después de llamar a WriteSample.
Cuando haya terminado de pasar ejemplos, llame a IWMWriter::EndWriting.
Nota Es importante que las muestras de todas las secuencias del archivo se pasen al escritor en sincronización entre sí. Es decir, siempre que sea posible, debe pasar muestras al escritor en orden en tiempo de presentación dentro de la tolerancia de sincronización especificada en IWMWriterAdvanced::SetSyncTolerance. Los mejores resultados se logran cuando los datos se entregan a cada flujo en unidades de un segundo o menos.
Las secuencias también deben terminar aproximadamente al mismo tiempo. Por ejemplo, no debe escribir un archivo con una secuencia de audio de 45 segundos y una secuencia de vídeo de 50 segundos. Si codifica este tipo de archivo con entradas no modificadas, algunos de los datos de audio al final de la secuencia se quitarán (aunque sea la secuencia más corta). Para que la codificación de archivos funcione, debe agregar 5 segundos de silencio a la entrada de audio para que una secuencia no finalice varios segundos antes que otra. No es necesario que los tipos de secuencia con muestras intermitentes, como secuencias de texto o imágenes, se rellenen de esta manera. Los flujos de comandos de script también deben seguir todas estas reglas.
Temas relacionados