
DirectShow (También abreviado comoDS oDShow), en sus iniciosQuartz, es unframework multimedia y unaAPI creada porMicrosoft paradesarrolladores de software con el fin de desempeñar numerosas operaciones con ficheros multimedia y streams. Se creó para reemplazar la antigua tecnología de MicrosoftVideo for Windows.[1] Basado en el frameworkMicrosoft WindowsComponent Object Model (COM), DirectShow proporciona una interfaz común para la gestión multimedia en diferenteslenguajes de programación, y es un framework con arquitectura basada enfiltros 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 deDirectXSDK. Actualmente, se distribuyen como parte deWindows SDK (antiguamente conocido comoPlatform SDK).[2]
Entre los contrincantes de DirectShow en otras plataformas están el frameworkQuickTime deApple y varios frameworks multimedia de Linux comoGStreamer oXine. Microsoft planea, gradualmente, reemplazar completamente DirectShow porMedia Foundation en futuras versiones de Windows.[3] Las aplicaciones paraWindows Vista yWindows 7 usan Media Foundation en lugar de DirectShow para algunas tareas relacionadas con multimedia.
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;}