Vista previa del proyecto
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
[Esta API no se admite y puede modificarse o no estar disponible en el futuro].
Para obtener una vista previa del proyecto, necesita un componente denominado motor de representación, que crea un gráfico de filtros directShow a partir de una escala de tiempo. El gráfico de filtro es lo que realmente representa el proyecto. Puede usar el motor de representación para obtener una vista previa de un proyecto o para escribir el archivo de salida final.
En este artículo no se detalla el motor de representación. Para obtener una vista previa, solo necesita algunas llamadas de método. Puede encontrar una explicación más exhaustiva, incluida la escritura de archivos de salida, en Representación de un proyecto. En el ejemplo de código siguiente se muestra cómo construir un gráfico de vista previa.
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
hr = pRender->RenderOutputPins( );
Cree el motor de representación mediante la función CoCreateInstance . A continuación, llame a los métodos siguientes en la interfaz IRenderEngine del motor de representación:
- SetTimelineObject. Especifica la escala de tiempo que se va a usar.
- ConnectFrontEnd. Crea un gráfico de filtro parcial, con un pin de salida para cada grupo de la escala de tiempo.
- RenderOutputPins. Completa el gráfico de vista previa conectando cada patilla de salida a un representador de audio o vídeo.
Una vez compilado el grafo, puede obtener una vista previa del proyecto ejecutando el grafo, como lo haría con cualquier gráfico de filtro directShow. En primer lugar, obtenga un puntero al gráfico de filtro llamando al método IRenderEngine::GetFilterGraph .
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
Consulte el gráfico de filtros para las interfaces IMediaControl e IMediaEvent . Use estas dos interfaces para ejecutar el gráfico y esperar a que se complete la reproducción. Para obtener una explicación de cómo usar estas interfaces, vea Cómo reproducir un archivo y responder a eventos. El código siguiente muestra una manera de usar estas interfaces.
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
long evCode;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
El código de este ejemplo bloquea la ejecución del programa hasta que se completa la reproducción, debido al parámetro INFINITE en la llamada al método IMediaEvent::WaitForCompletion . Sin embargo, si algo va mal durante la reproducción, podría hacer que el programa deje de responder. En una aplicación real, use un bucle de mensajes para esperar a que se complete la reproducción. También se recomienda proporcionar al usuario una manera de interrumpir la reproducción.
Cuando termine de usar el motor de representación, llame siempre al método IRenderEngine::ScrapIt . Este método elimina el gráfico de filtros y libera los recursos que mantiene el motor de representación.
pRender->ScrapIt();
Temas relacionados