DirectShow (a veces abreviado como DS o DShow ), nombre clave Quartz , es un marco multimedia y API producido por Microsoft para que los desarrolladores de software realicen varias operaciones con archivos o transmisiones multimedia. Es el reemplazo de la tecnología Video for Windows anterior de Microsoft. [1] Basado en el marco del Modelo de objetos componentes (COM) de Microsoft Windows , DirectShow proporciona una interfaz común para los medios en varios lenguajes de programación , y es un marco extensible basado en filtros que puede renderizar o grabar archivos multimedia a pedido del usuario o desarrollador. Las herramientas de desarrollo y la documentación de DirectShow se distribuyeron originalmente como parte del SDK de DirectX . [2] Actualmente, se distribuyen como parte del SDK de Windows (anteriormente conocido como el SDK de la plataforma). [3]
Microsoft planea reemplazar completamente DirectShow gradualmente con Media Foundation en futuras versiones de Windows. Una razón citada por Microsoft es proporcionar "un soporte mucho más sólido para sistemas de protección de contenido" [4] (ver gestión de derechos digitales ). Becky Weiss de Microsoft confirmó en 2006 que "notarás que trabajar con Media Foundation requiere que trabajes a un nivel ligeramente inferior al que tendrías si trabajaras con DirectShow. Y todavía hay características de DirectShow que (aún) no están en Media Foundation". [4] [5] Como se describe en el artículo de Media Foundation, las aplicaciones de Windows Vista y Windows 7 usan Media Foundation en lugar de DirectShow para varias tareas relacionadas con los medios.
El predecesor directo de DirectShow, ActiveMovie (cuyo nombre en código era Quartz), fue diseñado para proporcionar compatibilidad con MPEG-1 para Windows. También fue pensado como un futuro reemplazo para marcos de procesamiento de medios como Video for Windows y Media Control Interface , que nunca habían sido completamente adaptados a un entorno de 32 bits y no utilizaban COM. [6] [1]
El equipo de desarrollo utilizó como base para DirectShow un proyecto de procesador de medios digitales modular preexistente, cuyo nombre en código era "Clockwork". Clockwork ya se había utilizado anteriormente en el proyecto de televisión interactiva de Microsoft. [7]
El proyecto fue inicialmente llamado "ActiveMovie", y fue lanzado en mayo de 1996, incluido en la versión beta de Internet Explorer 3.0 . [8] [9] En marzo de 1997, Microsoft anunció que ActiveMovie pasaría a formar parte de la suite de tecnologías DirectX 5, y alrededor de julio comenzó a referirse a él como DirectShow, lo que refleja los esfuerzos de Microsoft en ese momento para consolidar las tecnologías que trabajaban directamente con el hardware bajo un esquema de nombres común. [10] [11] [12] DirectShow se convirtió en un componente estándar de todos los sistemas operativos Windows a partir de Windows 98 ; [13] sin embargo, está disponible en Windows 95 instalando el último redistribuible de DirectX disponible. [14] En la versión 8.0 de DirectX, DirectShow se convirtió en parte del SDK principal de DirectX junto con otras API de DirectX. [15]
En octubre de 2004, DirectShow fue eliminado de la distribución principal de DirectX y reubicado en la descarga de DirectX Extras. [ cita requerida ] En abril de 2005, DirectShow fue eliminado por completo de DirectX y se trasladó al SDK de Windows a partir de la versión Windows Server 2003 SP1 del SDK. [3] Sin embargo, el SDK de DirectX todavía era necesario para crear algunas de las muestras de DirectShow. [16]
Desde noviembre de 2007, las API de DirectShow forman parte del SDK de Windows . Incluye varias mejoras nuevas, códecs y actualizaciones de filtros, como el Enhanced Video Renderer (EVR) y DXVA 2.0 ( DirectX Video Acceleration ). [17]
DirectShow divide una tarea multimedia compleja (por ejemplo, la reproducción de vídeo) en una secuencia de pasos de procesamiento fundamentales conocidos como filtros . [18] [19] Cada filtro, que representa una etapa en el procesamiento de los datos, tiene pines de entrada y/o salida que pueden usarse para conectar el filtro a otros filtros. La naturaleza genérica de este mecanismo de conexión permite que los filtros se conecten de varias maneras para implementar diferentes funciones complejas. [20] Para implementar una tarea compleja específica, un desarrollador primero debe construir un gráfico de filtros creando instancias de los filtros requeridos y luego conectando los filtros entre sí. [21]
Hay tres tipos principales de filtros:
Durante el proceso de renderizado, el gráfico de filtros busca filtros registrados en el Registro de Windows y construye su gráfico de filtros en función de las ubicaciones proporcionadas. Después de esto, conecta los filtros entre sí y, a petición del desarrollador, ejecuta (es decir, reproduce, pausa, etc.) el gráfico creado. [ cita requerida ] Los gráficos de filtros de DirectShow se utilizan ampliamente en la reproducción de vídeo (en la que los filtros implementan funciones como análisis de archivos, demultiplexación de vídeo y audio, descompresión y renderizado), así como para la grabación, edición, codificación, transcodificación o transmisión de medios en red de vídeo y audio. DirectShow también puede controlar tareas interactivas como la navegación en DVD. [ cita requerida ]
En el ejemplo anterior, de izquierda a derecha, el gráfico contiene un filtro de origen para leer un archivo MP3, filtros divisores de flujo y decodificadores para analizar y decodificar el audio, y un filtro de renderización para reproducir las muestras de audio sin procesar. Cada filtro tiene uno o más pines que se pueden usar para conectar ese filtro a otros filtros. Cada pin funciona como una fuente de entrada o salida para que los datos fluyan de un filtro a otro. Dependiendo del filtro, los datos se "extraen" de un pin de entrada o se "envían" a un pin de salida para transferir datos entre filtros. Cada pin solo se puede conectar a otro pin y deben ponerse de acuerdo sobre qué tipo de datos están enviando. [ cita requerida ]
La mayoría de los filtros se crean utilizando un conjunto de clases C++ proporcionadas en el SDK de DirectShow, llamadas las Clases base de DirectShow. [ cita requerida ] Estas manejan gran parte de la lógica de creación, registro y conexión para el filtro. [23] Para que el gráfico de filtro use filtros automáticamente, deben registrarse en una entrada de registro de DirectShow separada, así como también con COM. Este registro puede ser administrado por las Clases base de DirectShow. Sin embargo, si la aplicación agrega los filtros manualmente, no necesitan estar registrados en absoluto. [ cita requerida ] Desafortunadamente, es difícil modificar un gráfico que ya se está ejecutando. Por lo general, es más fácil detener el gráfico y crear uno nuevo desde cero. A partir de DirectShow 8.0, se introdujeron la creación de gráficos dinámicos, la reconexión dinámica y las cadenas de filtros para ayudar a alterar el gráfico mientras se estaba ejecutando. [24] Sin embargo, muchos proveedores de filtros ignoran esta característica, lo que hace que la modificación del gráfico sea problemática después de que un gráfico haya comenzado a procesarse. [ cita requerida ]
Aunque DirectShow es capaz de construir dinámicamente un gráfico para representar un tipo de medio determinado, en ciertos casos es difícil para los desarrolladores confiar en esta funcionalidad y necesitan recurrir a la construcción manual de gráficos de filtros si el gráfico de filtros resultante es variable. [ cita requerida ] Es posible que los gráficos de filtros cambien con el tiempo a medida que se instalan nuevos filtros en la computadora. [ cita requerida ]
De forma predeterminada, DirectShow incluye una serie de filtros para decodificar algunos formatos de archivos multimedia comunes como MPEG-1 , MP3 , Windows Media Audio , Windows Media Video , MIDI , contenedores multimedia como AVI , ASF , WAV , algunos divisores/demultiplexores, multiplexores, filtros de origen y destino , algunos filtros de imagen estática, algo de aceleración de vídeo y compatibilidad mínima con la gestión de derechos digitales (DRM). [25] [26] El repertorio de formatos estándar de DirectShow se puede ampliar fácilmente mediante una variedad de filtros, lo que permite que DirectShow admita prácticamente cualquier formato de contenedor y cualquier códec de audio o vídeo. Por ejemplo, se han desarrollado filtros para Ogg Vorbis , Musepack y AC3 , y algunos códecs como MPEG-4 Advanced Simple Profile , AAC , H.264 , Vorbis y los contenedores MOV , MP4 están disponibles en terceros como ffdshow , K-Lite y CCCP . [27] [28] [29] La incorporación de soporte para códecs adicionales como estos puede implicar el pago de tarifas de licencia al desarrollador de la tecnología de códecs o al titular de la patente involucrado. [ cita requerida ] Finalmente, existen filtros "puente" que admiten simultáneamente múltiples formatos, así como funciones como multiplexación de flujo, al exponer la funcionalidad de las API multimedia subyacentes como VLC . [30]
La cantidad de trabajo necesaria para implementar un gráfico de filtros depende de varios factores. En el caso más simple, DirectShow puede crear un gráfico de filtros automáticamente a partir de una fuente, como un archivo o una URL. [31] Si esto no es posible, el desarrollador puede crear manualmente un gráfico de filtros a partir de un archivo de origen, posiblemente con la adición de un filtro personalizado, y luego dejar que DirectShow complete el gráfico de filtros conectando los filtros entre sí. En el siguiente nivel, el desarrollador debe construir el gráfico de filtros desde cero agregando y conectando manualmente cada filtro deseado. Finalmente, en los casos en los que no está disponible un filtro esencial, el desarrollador debe crear un filtro personalizado antes de poder construir un gráfico de filtros. [ cita requerida ]
A diferencia de la API C principal de QuickTime, donde es necesario llamar a MoviesTask en un bucle para cargar un archivo multimedia, DirectShow maneja todo esto de manera transparente. Crea varios subprocesos en segundo plano que reproducen sin problemas el archivo o URL solicitado sin que el programador tenga que hacer mucho trabajo. [ cita requerida ] Además, a diferencia de QuickTime, no se requiere nada especial para cargar una URL en lugar de un archivo local en el disco: el gráfico de filtros de DirectShow abstrae estos detalles del programador, aunque los desarrollos recientes en QuickTime (incluido un control ActiveX ) han reducido esta disparidad. [ cita requerida ]
DirectShow Editing Services (DES), introducido en DirectX 8.0/ Windows XP , es una API destinada a tareas de edición de vídeo y construida sobre la arquitectura central de DirectShow. DirectShow Editing Services se introdujo para Windows Movie Maker de Microsoft . [1] Incluye API para servicios de línea de tiempo y conmutación, cambio de tamaño, recorte, efectos de vídeo y audio, así como transiciones, incrustación , conversión automática de frecuencia de fotogramas y frecuencia de muestreo y otras características que se utilizan en la edición de vídeo no lineal, lo que permite la creación de medios compuestos a partir de una serie de secuencias de audio y vídeo de origen. DirectShow Editing Services permite la composición en tiempo de ejecución de nivel superior, la búsqueda de soporte y la gestión de gráficos, al tiempo que permite que las aplicaciones accedan a funciones DirectShow de nivel inferior.
Aunque la API original está en C++, se puede acceder a DirectShow Editing Services en cualquier lenguaje compatible con Microsoft .NET, incluidos Microsoft Visual C# y Microsoft Visual Basic , mediante una biblioteca de código de terceros llamada "DirectShowNet Library". [32] Alternativamente, se puede acceder a toda la API de DirectShow, incluidos DirectShow Editing Services, desde Borland Delphi 5, 6 y 7, C++ Builder 6 y desde versiones posteriores con algunas modificaciones menores, mediante una biblioteca de software de terceros llamada "DSPack". [33]
En marzo de 2012 [34] (y, aparentemente, ya en 2009 [35] ), Microsoft declaró que la API de DirectShow Editing Services "no es compatible y puede modificarse o no estar disponible en el futuro".
Originalmente, en Windows 9x , DirectShow usaba el filtro Video Renderer . Este dibujaba las imágenes usando DirectDraw 3, pero también podía recurrir a los modos de dibujo GDI o superposición en algunas circunstancias (dependiendo de la visibilidad de la ventana de video y las capacidades de la tarjeta de video). [14] [36] Tenía acceso limitado a la ventana de video. [ cita requerida ] El video para Windows había estado plagado de bloqueos causados por el manejo incorrecto de las ventanas de video por parte de las aplicaciones, por lo que en las primeras versiones de DirectShow, el identificador de la ventana de reproducción estaba oculto para las aplicaciones. Tampoco había una forma confiable de dibujar texto de subtítulos o gráficos sobre el video. [ cita requerida ]
DirectShow 6.0, lanzado como parte de DirectX Media , introdujo el renderizador Overlay Mixer diseñado para reproducción de DVD y transmisión de secuencias de video con subtítulos y subtítulos . [ cita requerida ] Overlay Mixer utiliza DirectDraw 5 para renderizar. [ 14 ] Se requiere una conexión descendente con Video Renderer para la administración de ventanas. [ cita requerida ] Overlay Mixer también admite extensiones de puerto de video (VPE), lo que le permite trabajar con sintonizadores de TV analógicos con capacidad de superposición (enviar video directamente a una tarjeta de video a través de un enlace analógico en lugar de a través del bus PCI ). Overlay Mixer también admite conexiones DXVA . [ cita requerida ] Debido a que siempre renderiza en superposición , el video de pantalla completa a la salida de TV siempre está activado.
A partir de Windows XP , se introdujo un nuevo filtro llamado Video Mixing Renderer 7 ( VMR-7 o, a veces, simplemente VMR ). El número 7 se debía a que VMR-7 solo usaba DirectDraw versión 7 para renderizar el video y no tenía la opción de usar el dibujo GDI. La principal característica nueva de VMR-7 era la capacidad de mezclar múltiples transmisiones y gráficos con mezcla alfa, lo que permitía a las aplicaciones dibujar texto y gráficos sobre el video y admitir efectos personalizados. [37] También presentaba un "modo sin ventanas" (acceso a la imagen compuesta antes de que se renderice) que solucionaba los problemas con el acceso al controlador de ventana. [38]
DirectX 9 introdujo VMR-9 , que está incluido en Windows XP SP2 y posteriores. [39] Esta versión utiliza Direct3D 9 en lugar de DirectDraw, lo que permite a los desarrolladores transformar imágenes de vídeo utilizando los sombreadores de píxeles de Direct3D. [40] Está disponible para todas las plataformas Windows como parte del paquete redistribuible de DirectX 9. [ cita requerida ] Como VMR-7, proporciona un modo sin ventanas. Sin embargo, a diferencia del mezclador de superposición o VMR-7, no admite puertos de vídeo. [41] El uso de la opción de arranque /3GB puede provocar que VMR-9 falle. [42]
Windows Vista y Windows 7 se entregan con un nuevo renderizador, disponible como un componente de Media Foundation y un filtro DirectShow, llamado Enhanced Video Renderer ( EVR ). [43] EVR está diseñado para funcionar con Desktop Window Manager y es compatible con DXVA 2.0 , que está disponible en Windows Vista y Windows 7. [44] [ cita requerida ] Ofrece un mejor rendimiento y una mejor calidad según Microsoft. [45]
El 8 de enero de 2007, Microsoft recibió el premio Emmy por Arquitecturas y Componentes de Medios de Transmisión en la 58.ª edición anual de los Premios Emmy de Tecnología e Ingeniería . [46]
Ordenar a DirectShow que reproduzca un archivo es una tarea relativamente sencilla. Sin embargo, al programar personalizaciones más avanzadas, como ordenar a DirectShow que muestre determinados mensajes de la ventana de vídeo o crear filtros personalizados, muchos desarrolladores se quejan de dificultades. [47] [48] Se considera una de las bibliotecas/API de desarrollo más complejas de Microsoft. [49] [ cita requerida ]
Los desarrolladores rara vez crean filtros DirectShow desde cero. En su lugar, emplean clases base de DirectShow. [ cita requerida ] Las clases base a menudo pueden simplificar el desarrollo, lo que permite al programador omitir ciertas tareas. Sin embargo, el proceso puede seguir siendo relativamente complejo; [ cita requerida ] el código que se encuentra en las clases base es casi la mitad del tamaño de toda la biblioteca MFC . [ cita requerida ] Como resultado, incluso con las clases base, la cantidad de objetos COM que contiene DirectShow a menudo abruma a los desarrolladores. [ cita requerida ] [ palabras ambiguas ] En algunos casos, la API de DirectShow se desvía de las reglas COM tradicionales, particularmente con respecto a los parámetros utilizados para los métodos . [ cita requerida ] [ palabras ambiguas ] Para superar sus dificultades con las reglas COM únicas de DirectShow, los desarrolladores a menudo recurren a una API de nivel superior que utiliza DirectShow, en particular, Windows Media Player SDK , una API que proporciona al desarrollador un control ActiveX que tiene menos interfaces COM con las que lidiar. [ cita requerida ] [ palabras ambiguas ]
Aunque DirectShow es capaz de construir dinámicamente un gráfico para representar un tipo de medio determinado, en ciertos casos es difícil para los desarrolladores confiar en esta funcionalidad y necesitan recurrir a la construcción manual de gráficos de filtros si el gráfico de filtros resultante es variable. [ cita requerida ] Es posible que los gráficos de filtros cambien con el tiempo a medida que se instalan nuevos filtros en la computadora. [ cita requerida ]
El infierno de códecs (un término derivado de DLL hell ) se produce cuando varios filtros DirectShow entran en conflicto para realizar la misma tarea. Una gran cantidad de empresas desarrollan ahora códecs en forma de filtros DirectShow, lo que da como resultado la presencia de varios filtros que pueden decodificar el mismo tipo de medio. [50] [51] Este problema se ve agravado aún más por el sistema de méritos de DirectShow, donde las implementaciones de filtros terminan compitiendo entre sí al registrarse con una prioridad cada vez mayor. [51]
Ted Youmans, de Microsoft, explicó que "DirectShow se basaba en el sistema de méritos, con la idea de que, utilizando una combinación de los méritos del filtro y lo específico que es el tipo/subtipo de medio, uno podría elegir razonablemente el códec correcto cada vez. En realidad, no estaba diseñado para una carrera armamentística nuclear basada en méritos". [51]
Una herramienta que ayuda a solucionar los problemas de "codec hell" a los que se suele hacer referencia es GSpot Codec Information Appliance, que puede resultar útil para determinar qué códec se utiliza para renderizar archivos de vídeo en AVI y otros contenedores. [52] GraphEdit también puede ayudar a comprender la secuencia de filtros que DirectShow utiliza para renderizar el archivo multimedia. El problema del codec hell se puede resolver creando manualmente gráficos de filtros, utilizando un reproductor multimedia que admita ignorar o anular los méritos de los filtros o utilizando un administrador de filtros que cambie los méritos de los filtros en el Registro de Windows . [22]
DirectShow, al ser un marco y una API centrados en el desarrollador, no ofrece directamente al usuario final control sobre la codificación de contenido, ni incorpora una interfaz de usuario para codificar utilizando códecs instalados o en diferentes formatos; en cambio, depende de los desarrolladores para desarrollar software utilizando la API. Por el contrario, otros marcos multimedia como QuickTime o Video para Windows permiten a los usuarios finales realizar tareas básicas relacionadas con el video, como volver a codificar utilizando un códec diferente y editar archivos y transmisiones. [ cita requerida ] La conveniencia que ofrece una GUI para el usuario final es evidente ya que el formato AVI y los códecs utilizados por Video para Windows todavía siguen en uso, por ejemplo, VirtualDub .