Compartir a través de


Usar los códecs multimedia de ventana en DirectShow

Los objetos de codificador y descodificador audio y vídeo de Windows Media se diseñaron y optimizaron originalmente para trabajar con el formato de contenedor de archivos ASF y el SDK de Windows Media Format. Los objetos de códec funcionan bien en DirectShow para determinados escenarios, es decir, la codificación de VBR basada en un solo paso y la codificación vbR basada en calidad de secuencias de vídeo. Pero si está pensando en usar los objetos de códec directamente en DirectShow mediante contenedores de archivos distintos de ASF, hay ciertos comportamientos y problemas que debe tener en cuenta de antemano.

Nota:

Si vas a usar códecs independientes con DirectShow, probablemente querrás usarlos solo como DPO. En otras palabras, usará la interfaz IMediaObject en lugar de IMFTransform.

 

Wm Audio en archivos AVI

Puede usar DirectShow para codificar secuencias WMA en cualquier formato de contenedor de archivos para el que tenga un filtro de multiplexador. Sin embargo, las interfaces de códec de audio y vídeo de Windows Media no admiten WMA en archivos AVI porque es imposible, usando los filtros de reproducción de DirectShow AVI predeterminados, para mantener la sincronización de audio-vídeo en un archivo AVI con una secuencia WMA. Para obtener más información, consulte Almacenamiento de medios comprimidos en archivos AVI.

El codificador de audio DMO genera muestras de duración variable, incluso cuando se encuentra en modo de "velocidad de bits constante". Por lo tanto, funciona mejor con formatos de contenedor de archivos que usan marcas de tiempo. Los archivos AVI no proporcionan una marca de tiempo para cada muestra de audio o grupo de muestras. En DirectShow, el filtro Divisor AVI fabrica marcas de tiempo para cada grupo de muestras (cada fotograma de audio) basándose en el valor nAvgBytesPerSec de la estructura WAVEFORMATEX en el encabezado de secuencia AVI.

La suposición subyacente a este cálculo es que todas las muestras de audio de la secuencia tienen una duración igual; sin embargo, la salida de muestras de DMO no es igual a la duración y, por tanto, las marcas de tiempo aplicadas por el divisor AVI no son precisas. Por lo tanto, no es posible, sin modificar el divisor AVI o el descodificador de audio DMO, para usar cualquier aplicación basada en DirectShow para reproducir archivos AVI con secuencias de audio y vídeo sincronizadas. El códec windows Media Audio 9 Voice funcionará en algunos casos, pero incluso esto perderá la sincronización después de cualquier operación de búsqueda, por lo que realmente no se puede considerar una solución viable.

Si tiene un codificador MP3, puede crear archivos AVI con WMV y MP3 para la secuencia de audio. Estos archivos se reproducirán y buscarán correctamente en Reproductor multimedia de Windows y otras aplicaciones basadas en DirectShow, ya que avi Splitter contiene código de control especial para secuencias MP3. Otra opción es usar audio PCM sin comprimir, aunque obviamente el tamaño del archivo resultante será mucho mayor que con una secuencia de audio comprimida. Dado que la aplicación de ejemplo DirectShow crea archivos AVI, no muestra cómo usar el codificador de audio DMO.

Codificación de un solo paso

El codificador de vídeo DMO funciona fácilmente en DirectShow para dos modos de codificación: CBR y VBR basado en calidad. Siempre y cuando siga el orden correcto de las operaciones al compilar el gráfico de filtros, como se muestra en la aplicación de ejemplo, es relativamente sencillo colocar el contenido WMV en un archivo AVI mediante avi Multiplexer y File Writer.

Codificación de dos pasos

Los modos de codificación de dos pasos requieren un enfoque más complejo para la creación y el streaming de grafos con el fin de evitar que DMO vacíe su contenido desde el primer paso antes de comenzar el segundo paso. En la codificación de dos pasos, es necesario ejecutar el grafo una vez para que DMO pueda realizar su análisis de preprocesamiento de los datos del archivo y, a continuación, rebobinar el grafo y ejecutarlo de nuevo para que DMO pueda realizar la codificación real.

Cuando el gráfico entra en un estado de ejecución para el segundo paso, el contenedor de DMO establece la marca DISCONTINUITY en la primera muestra, porque la marca de tiempo no es secuencial con la última marca de tiempo en el primer paso. Cuando el DMO, que no estaba diseñado para funcionar en DirectShow de esta manera, recibe la marca DISCONTINUITY, realiza un vaciado y pierde los datos almacenados del primer paso. Para solucionar este problema, la mejor solución es escribir un filtro contenedor de DMO personalizado que no establece la marca DISCONTINUITY cuando se busca el gráfico después del primer paso. En el ejemplo Vídeo para Windows (VfW) de este SDK se muestra cómo realizar la codificación de dos pasos.

Contenido entrelazado

El codificador WMV DMO es capaz de codificar contenido entrelazado a la vez que conserva la entrelazamiento, que es útil para el contenido que se captura de un televisor y también se puede reproducir en un televisor. Sin embargo, no es posible conservar la entrelazamiento mediante el contenedor DMO predeterminado, ya que ese filtro no admite INSSBuffer en sus ejemplos de entrada.

El DMO usa esa interfaz para obtener la configuración entrelazada de cada muestra que recibe. Si no se encuentra la interfaz, como sucede con el contenedor DMO, DMO simplemente trata las muestras de entrada como no entrelazadas. Para realizar la codificación entrelazada en DirectShow, hay varias alternativas. Es probable que el enfoque más sencillo sea usar el SDK de la serie Windows Media Format 9 directamente o mediante el filtro DirectShow de WM ASF Writer para crear un archivo ASF entrelazado. Después, puede transcodificar ese archivo en otro formato. Si transcodificas en AVI, tendrás un archivo entrelazado, pero los filtros de reproducción estándar de DirectShow AVI no lo reconocerán como tal porque no admiten VIDEOINFOHEADER2. Otro enfoque consiste en escribir su propio filtro contenedor DMO que admita la interfaz INSSBuffer .

Trabajar con DPO de códec