Editar

Compartir a través de


Preguntas más frecuentes sobre DirectShow

En este artículo se responden muchas preguntas más frecuentes sobre Microsoft DirectShow.

¿Qué sistemas operativos admite DirectShow?

DirectShow está disponible en todas las versiones compatibles de Windows.

¿Cuánto conocimiento com necesito programar con DirectShow?

Para el desarrollo de aplicaciones, debe comprender los conceptos básicos del trabajo con objetos COM: cómo crear instancias de ellos, acceder a las interfaces que exponen y administrar recuentos de referencias en esas interfaces. El desarrollo de filtros requiere más conocimientos COM.

¿Qué formatos admite DirectShow?

¿Hay una lista de compatibilidad de hardware (HCL) directShow?

No. DirectShow usa las funcionalidades de hardware de Microsoft DirectDraw y Microsoft DirectSound si están disponibles. Cuando no hay hardware especial disponible, DirectShow usa GDI para dibujar vídeo y las API multimedia waveOut * para reproducir audio.

¿Qué idiomas puedo usar para escribir una aplicación DirectShow?

DirectShow está diseñado principalmente para el desarrollo de C++. Un pequeño subconfigurado de la API directShow se expone a través de Visual Basic 6.0; sin embargo, esta característica está en desuso.

¿Se podrá acceder a DirectShow a través del código administrado?

Microsoft no tiene planes actuales para implementar una API de DirectShow administrada.

¿Qué compilador necesito para el desarrollo de DirectShow?

Cualquier compilador capaz de generar objetos de modelo de objetos componentes (COM) debe funcionar una vez que el entorno del compilador se haya configurado correctamente.

¿Cómo se relaciona DirectShow con Microsoft DirectX?

Internamente, DirectShow usa DirectSound y DirectDraw cuando el hardware lo admite. Los filtros Video Renderer y Mezclador de superposición usan superficies DirectDraw 3 y DirectDraw 5. El representador de mezcla de vídeos 7 (solo Windows XP) usa superficies de DirectDraw 7. El representador de mezcla de vídeo 9 y el representador de vídeo mejorado usan las API de Microsoft Direct3D más recientes. No es necesario usar las otras API de DirectX para escribir una aplicación DirectShow, aunque es posible combinarlas.

¿Cómo se relaciona DirectShow con Microsoft ActiveMovie?

ActiveMovie era el nombre original de DirectShow. El término ActiveMovie ya no se usa.

¿Está disponible el código fuente de la utilidad GraphEdit? ¿Se puede redistribuir GraphEdit?

No, el origen no está disponible y Graphedt.exe no se puede redistribuir.

¿Reemplazan los filtros DirectShow?

Microsoft DirectX Media Objects (DPO) se puede usar en una aplicación DirectShow. Para codificadores, descodificadores y efectos, se recomienda escribir un DMO en lugar de un filtro DirectShow. (Nota: Si desea usar DirectX Video Acceleration en el descodificador, debe implementarlo como filtro). Para otros fines, un filtro DirectShow podría ser más adecuado. Para obtener más información sobre las DPO, vea Objetos multimedia de DirectX.

Estoy reproduciendo un archivo de formato AVI con Reproductor multimedia de Windows. Puedo oír el audio, pero no parece haber ningún video en su lugar, sólo veo negro. ¿Qué ocurre?

Probablemente el archivo se codificó con un códec que no está presente en el sistema. Aunque el formato de archivo AVI es común, los archivos AVI se pueden crear con muchos formatos de compresión diferentes (códecs). Si intenta reproducir un archivo AVI que usa un códec no compatible, es posible que escuche el componente de audio, pero el vídeo se mostrará como una pantalla negra o el contenido de la pantalla permanecerá sin cambios.

Nota

Reproductor multimedia de Windows a menudo intenta descargar e instalar un códec si no está presente en el sistema.

 

Cómo compilar mi aplicación? ¿Qué bibliotecas y archivos de encabezado necesito?

GraphEdit muestra muchos filtros que no están documentados. ¿Cuáles son estos filtros?

GraphEdit enumera todos los filtros registrados en el sistema en una categoría de filtro. Esto puede incluir filtros instalados por aplicaciones de terceros o instalados por otras tecnologías de Microsoft, como Windows Media o NetMeeting. Además, algunos filtros DirectShow actúan como contenedores para códecs o dispositivos de hardware, con cada códec o dispositivo que aparece como un filtro distinto. NetMeeting usa el códec de vídeo H.263 de Microsoft y ya no se admite en DirectShow. Para obtener más información, vea Enumerar dispositivos y filtros.

Tengo problemas para crear mi grafo personalizado mediante programación.

En primer lugar, pruebe a compilar el gráfico de filtros con GraphEdit. Esta herramienta le permite simular muchas posibilidades rápidamente. GraphEdit siempre es un excelente lugar para probar el gráfico antes de intentar compilarlo con código fuente.

Para obtener más información sobre la creación de grafos, consulte los siguientes artículos:

¿Cómo puedo detectar si DirectShow está instalado en un equipo determinado?

Llame a CoCreateInstance para crear una instancia del Administrador de gráficos de filtros. Si esta llamada se realiza correctamente, DirectShow se instala en el equipo. El código siguiente muestra cómo hacerlo:

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void **) &pGraph);

Cómo cambiar la configuración de un filtro sin mostrar la página de propiedades?

La mayoría de los filtros exponen una o varias interfaces para establecer propiedades en el filtro. Consulte la página de referencia del filtro en cuestión. (Consulte DirectShow Filters).)

¿Puedo probar mi filtro con GraphEdit?

Mientras desarrolla un filtro, GraphEdit puede ayudarle a visualizar las conexiones entre filtros. También puede proporcionar una prueba rápida de la funcionalidad de un filtro. Sin embargo, no está pensado como una plataforma de prueba sólida.

¿En qué anillo de privilegios se ejecutan los filtros?

Los filtros se ejecutan en el anillo 3, aunque algunos filtros controlan los dispositivos de streaming que se ejecutan en el anillo 0. Para obtener más información, vea Cómo participan los dispositivos de hardware en el gráfico de filtros.

¿Es necesario usar un depurador de kernel?

Depende de su proyecto específico. La instalación de las bibliotecas en tiempo de ejecución de depuración de DirectX significa que va a instalar controladores de depuración y otros componentes de modo kernel, y que si la aplicación provoca una aserción de depuración en uno de estos componentes, la máquina se reiniciará automáticamente a menos que tenga un depurador de kernel asociado al proceso.

Cuando ejecuto mi aplicación en el depurador, se bloquea.

Algunos descodificadores están diseñados para no funcionar mientras la aplicación está asociada al depurador. Intente ejecutar la aplicación fuera del depurador.

¿Cómo funciona la macro DEFINE\_GUID?

La macro DEFINE_GUID resuelve el problema de declarar extern referencias a valores GUID en el código fuente. Por ejemplo, supongamos que el proyecto tiene tres archivos de código fuente, Src1.cpp, Src2.cpp y Src3.cpp, y los tres archivos usan un determinado valor GUID definido. El valor guid debe definirse exactamente una vez en el proyecto y los demás archivos de origen deben declarar extern referencias a él. Con la macro DEFINE_GUID , puede usar el mismo archivo de encabezado para ambos fines. En el archivo de encabezado, declare el GUID de la siguiente manera:

DEFINE_GUID(CLSID_MyObject, 
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

(Donde este ejemplo tiene ceros, coloque los valores GUID reales). Puede usar la utilidad Guidgen.exe para crear un NUEVO GUID y pegarlo en el archivo de encabezado en el formato DEFINE_GUID . Incluya este archivo de encabezado en cada archivo de origen que haga referencia al GUID. En exactamente uno de los archivos de origen, incluya el archivo de encabezado Initguid.h antes del archivo de encabezado. Por ejemplo:

// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"

// Src2.cpp
#include "MyGuids.h"

// Src3.cpp
#include "MyGuids.h"

Dondequiera que no se incluya el archivo de encabezado Initguid.h, la macro DEFINE_GUID crea una extern referencia al valor GUID. Cuando se incluye el archivo de encabezado Initguid.h, vuelve a definir la macro DEFINE_GUID para que DEFINE_GUID cree una declaración de definición del GUID.

Si no incluye Initguid.h en ninguno de los archivos de origen, obtendrá un error de vínculo "símbolo externo sin resolver". Si incluye Initguid.h dos veces para el mismo GUID, obtendrá un error de compilación "redefinición; inicialización múltiple". Para resolver estos errores, asegúrese de que Initguid.h se incluye exactamente una vez. Además, no incluya Initguid.h dentro de un archivo de encabezado precompilado, ya que en efecto el encabezado precompilado se incluye en todos los archivos de origen.

Introducción a DirectShow