Compartir a través de


Para crear archivos ASF mediante códecs de terceros

[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.

Puedes usar el SDK de Windows Media Format para crear archivos ASF que contengan medios digitales codificados con cualquier códec que elijas. Al usar un códec distinto de uno incluido con este SDK, debe realizar los pasos siguientes.

  1. Codifique el contenido con el códec deseado.
  2. Busque o cree un valor GUID para identificar el contenido codificado con el códec usado en el paso 1.
  3. Cree un nuevo perfil o modifique un perfil existente para usarlo con el contenido codificado.
    • Cree una secuencia para el contenido codificado con el tipo principal adecuado. Para obtener más información sobre los tipos de medios principales, vea Tipos de medios. Use el GUID identificado en el paso 2 como subtipo de medio.
    • Establezca la velocidad de bits y la ventana de búfer de la secuencia en valores que no darán lugar a un desbordamiento del búfer. Debería poder obtener estos valores del códec en el momento de la codificación. Los componentes del entorno de ejecución del SDK comprueban los valores de la ventana de velocidad de bits/búfer y quitan ejemplos si es necesario para que los datos especificados se ajusten a estos valores. Si establece los valores incorrectamente, el archivo no se transmitirá correctamente, lo que da lugar a una reproducción deficiente.
    • En el caso de las secuencias de vídeo, debe establecer el miembro biCompression de la estructura BITMAPINFOHEADER contenida en la estructura WMVIDEOINFOHEADER en el valor FOURCC adecuado para el contenido. Este valor debe ser igual a los cuatro primeros bytes del GUID del subtipo. Por ejemplo, si biCompression es MAKEFOURCC('T','E','S','T')=0x54455354, el GUID del subtipo comenzará de esta manera: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  4. Cree un objeto writer y cargue el perfil creado en el paso anterior. Para obtener más información sobre cómo escribir archivos, vea Escribir archivos ASF.
  5. Recorra en bucle las entradas del archivo y asigne propiedades de entrada para cada como lo haría normalmente. Para obtener más información sobre las entradas, vea Trabajar con entradas. Para la secuencia codificada con un códec de terceros, establezca el puntero de interfaz IWMInputMediaProps en NULL antes de llamar a IWMWriter::BeginWriting.
  6. Use el nuevo perfil creado en el paso anterior para escribir el archivo. Pase los ejemplos comprimidos mediante IWMWriterAdvanced::WriteStreamSample en lugar de IWMWriter::WriteSample. En el caso del vídeo, debe especificar qué ejemplos son fotogramas clave pasando WM_SF_CLEANPOINT como parámetro dwFlags .

Para procesar y descomprimir la secuencia codificada con un códec de terceros, debe leer muestras de secuencia comprimidas. La aplicación de lectura también debe controlar la descompresión de ejemplo para la secuencia.

Colocación de secuencias MPEG-2 en ASF

Nota

Este tema se aplica a las aplicaciones que usan el SDK de Windows Media Format para colocar MPEG-2 (u otros formatos de compresión que usan marcos B) en el contenedor de archivos ASF.

 

El objeto writer requiere que todas las muestras de entrada tengan marcas de tiempo y se supone que cada ejemplo de entrada tiene un tiempo de presentación posterior al que lo precedió. Aunque prácticamente todos los vídeos sin comprimir e incluso algunas secuencias de vídeo comprimidos cumplen estas condiciones, las secuencias MPEG-2 no. En MPEG-2, no todas las muestras tienen marca de tiempo y, cuando hay fotogramas B, el orden de descodificación de muestra no es el mismo que el orden de representación. Cuando el objeto writer encuentra ejemplos desordenados, los reorganiza en el orden "correcto". Por lo tanto, para almacenar secuencias MPEG-2 de forma nativa (no descodificada) en un contenedor asf, debe realizar los pasos siguientes:

Al escribir el archivo:

  1. Agregue una extensión de unidad de datos de tamaño fijo (DUE) a cada ejemplo de entrada que contendrá una estructura que contiene los valores reales de tiempo de inicio y tiempo de detención de la marca de tiempo MPEG para el ejemplo. Use -1 para estos valores si el ejemplo no tiene marca de tiempo.
  2. Asigne al objeto de escritura marcas de tiempo de entrada "ficticas" que siempre aumentan para que escriba las muestras en el archivo exactamente en el mismo orden en que se reciben. Las marcas de tiempo ficticias deben corresponder aproximadamente a los tiempos de presentación reales, según el promedio a lo largo del tiempo. Las marcas de tiempo ficticas formarán la escala de tiempo de búsqueda, por lo que si divergen en relación con las marcas en tiempo real, las operaciones de búsqueda en el archivo generarán resultados inesperados. Sin embargo, una cantidad limitada de vibración entre los tiempos de muestra no afectará seriamente a las operaciones de búsqueda.

Al leer el archivo:

  • Para cada ejemplo leído del archivo, examine el DUE. Si contiene una hora de inicio mayor o igual que cero, copie ese valor en la marca de tiempo del ejemplo de salida antes de entregarlo al descodificador. Establezca todas las demás marcas de tiempo en los ejemplos de salida en NULL. En DirectShow, esto se hace llamando a IMediaSample::SetTime(NULL,NULL).

Almacenamiento en búfer de contenido

IWMWriter (Interfaz)

IWMWriterAdvanced (Interfaz)

Para entregar ejemplos comprimidos con el lector asincrónico

Para recuperar ejemplos de secuencias con el lector sincrónico

WMVIDEOINFOHEADER

Trabajar con perfiles

Escritura de archivos ASF