DirectShow

DirectShow (También abreviado como DS o DShow), en sus inicios Quartz, es un framework multimedia y una API creada por Microsoft para desarrolladores de software con el fin de desempeñar numerosas operaciones con ficheros multimedia y streams. Se creó para reemplazar la antigua tecnología de Microsoft Video for Windows.  Basado en el framework Microsoft Windows Component Object Model (COM), DirectShow proporciona una interfaz común para la gestión multimedia en diferentes lenguajes de programación, y es un framework con arquitectura basada en filtros que puede reproducir en pantalla y grabar ficheros de video bajo demanda del usuario o el desarrollador. Las herramientas de desarrollo de DirectShow y la documentación fue originalmente distribuida como parte de DirectX SDK. Actualmente, se distribuyen como parte de Windows SDK (antiguamente conocido como Platform SDK).

Entre los contrincantes de DirectShow en otras plataformas están el framework QuickTime de Apple y varios frameworks multimedia de Linux como GStreamer o Xine. Microsoft planea, gradualmente, reemplazar completamente DirectShow por Media Foundation en futuras versiones de Windows. Las aplicaciones para Windows Vista y Windows 7 usan Media Foundation en lugar de DirectShow para algunas tareas relacionadas con multimedia.

Ejemplo de código fuente 

El siguiente ejemplo muestra cómo crear una aplicación sencilla que reproduzca un fichero de video visualizándolo por pantalla:

 #include "stdafx.h"
 #include <dshow.h>
 int _tmain(int argc, _TCHAR* argv[])
 {
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
    IMediaSeeking *pSeeking = NULL;
 
    // Inicializa la biblioteca COM.
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - No se ha podido inicializar la biblioteca COM");
        system("pause");
        return -1;
    }
 
    // Crea el gestor de grafos y filtros y obtiene las interfaces de control.
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - No se ha podido crear el gestor de grafos y filtros.");
        system("pause");
        return -1;
    }
 
    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
    hr = pGraph->QueryInterface(IID_IMediaSeeking, (void **)&pSeeking);
 
    // Construye el grafo DirectShow
    hr = pGraph->RenderFile(L"D:\\Videos\\costaColorW.mpg", NULL);
    if (SUCCEEDED(hr))
    {
        // Inicia la reproducción de grafo
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // Opcional: Configura la reproducción para que se detenga a los 10 segundos
            LONGLONG pCurrent = 0, pStop = 100000000;
            hr = pSeeking->SetPositions(&pCurrent, AM_SEEKING_AbsolutePositioning, &pStop, AM_SEEKING_AbsolutePositioning);
            if (FAILED(hr)) {
                printf("ERROR - SetPositions ha fallado.");
            }
 
            // Espera a que la reproducción finalice.
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);
            // Nota: No utilice INFINITE en una aplicación real, puede provocar
            // el bloqueo indefinido.
        }
    } else
        printf("ERROR - El fichero no existe o no hay codec para reproducirlo.");
 
    // Ejecuta el comando 'pause' una vez finalizada la reproducción.
    system("pause");
 
    pControl->Release();
    pEvent->Release();
    pSeeking->Release();
    pGraph->Release();
    CoUninitialize();
 
    return 0;
 }

Véase también 
 GraphStudio – open source GraphEdit project
 DirectX Media Objects
 DirectX plugins
 DirectX Video Acceleration
 DirectShowPlayer

Referencias 
 
  (Sample Chapter)

Notas

Enlaces externos (en inglés) 
 DirectShow on MSDN (documentación oficial)
 J. River DirectShow Playback Guide (tutorial sobre DirectShow con información general)
 VideoLab (librería de procesamiento de vídeo con soporte para DirectShow (gratis para propósitos no comerciales))

Interfaces de programación de aplicaciones de Microsoft
Frameworks multimedia
Show DirectShow