Vorschau des Project
[Diese API wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein.]
Um eine Vorschau des Projekts anzuzeigen, benötigen Sie eine Komponente namens Render-Engine, die ein DirectShow-Filterdiagramm aus einer Zeitachse erstellt. Das Filterdiagramm rendert das Projekt tatsächlich. Sie können die Render-Engine verwenden, um eine Vorschau eines Projekts anzuzeigen oder die endgültige Ausgabedatei zu schreiben.
In diesem Artikel wird die Render-Engine nicht ausführlich behandelt. Für die Vorschau benötigen Sie nur einige Methodenaufrufe. Eine eingehendere Erörterung, einschließlich des Schreibens von Ausgabedateien, finden Sie unter Rendering a Project. Das folgende Codebeispiel zeigt, wie sie ein Vorschaudiagramm erstellen.
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( );
Erstellen Sie die Render-Engine mithilfe der CoCreateInstance-Funktion. Rufen Sie dann die folgenden Methoden auf der IRenderEngine-Schnittstelle der Render-Engine auf:
- SetTimelineObject. Gibt die zu verwendende Zeitachse an.
- ConnectFrontEnd. Erstellt ein partielles Filterdiagramm mit einem Ausgabepin für jede Gruppe auf der Zeitachse.
- RenderOutputPins. Schließt das Vorschaudiagramm ab, indem jeder Ausgabepin mit einem Video- oder Audiorenderer verbunden wird.
Sobald das Diagramm erstellt wurde, können Sie eine Vorschau des Projekts anzeigen, indem Sie das Diagramm wie bei jedem DirectShow-Filterdiagramm ausführen. Rufen Sie zunächst einen Zeiger auf das Filterdiagramm ab, indem Sie die IRenderEngine::GetFilterGraph-Methode aufrufen.
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
Fragen Sie das Filterdiagramm für die Schnittstellen IMediaControl und IMediaEvent ab. Verwenden Sie diese beiden Schnittstellen, um den Graphen ausführen und auf den Abschluss der Wiedergabe warten zu können. Eine Erläuterung der Verwendung dieser Schnittstellen finden Sie unter How To Play a File and Responding to Events. Der folgende Code zeigt eine Möglichkeit, diese Schnittstellen zu verwenden.
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();
Der Code in diesem Beispiel blockiert die Programmausführung, bis die Wiedergabe abgeschlossen ist. Dies liegt an dem INFINITE-Parameter im IMediaEvent::WaitForCompletion-Methodenaufruf. Wenn während der Wiedergabe jedoch etwas schief geht, kann dies dazu führen, dass das Programm nicht mehr reagiert. Verwenden Sie in einer echten Anwendung eine Meldungsschleife, um auf den Abschluss der Wiedergabe zu warten. Es wird auch empfohlen, dass Sie dem Benutzer eine Möglichkeit bieten, die Wiedergabe zu unterbrechen.
Wenn Sie die Verwendung der Render-Engine abgeschlossen haben, rufen Sie immer die IRenderEngine::ScrapIt-Methode auf. Diese Methode löscht das Filterdiagramm und gibt alle Ressourcen frei, die von der Render-Engine gespeichert sind.
pRender->ScrapIt();