Condividi tramite


Anteprima di un progetto

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

[Questa API non è supportata e può essere modificata o non disponibile in futuro.]

Per visualizzare in anteprima un progetto, chiamare prima CoCreateInstance per creare un'istanza del motore di rendering di base. L'identificatore della classe è CLSID_RenderEngine. Chiamare quindi il metodo IRenderEngine::SetTimelineObject per specificare la sequenza temporale di cui si esegue il rendering.

La prima volta che si visualizza l'anteprima della sequenza temporale, eseguire le chiamate seguenti nell'ordine elencato:

  1. Chiamare IRenderEngine::SetRenderRange per specificare la parte della sequenza temporale in anteprima. Facoltativa
  2. Chiamare IRenderEngine::ConnectFrontEnd per compilare il front-end del grafico.
  3. Chiamare IRenderEngine::RenderOutputPins. Questo metodo connette ogni pin di output a un renderer video o a un renderer audio, completando il grafico.

Nell'esempio di codice seguente vengono illustrati questi passaggi:

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();

Eseguire ora il grafico del filtro. Prima di tutto, chiamare il metodo IRenderEngine::GetFilterGraph per recuperare un puntatore all'interfaccia IGraphBuilder di Filter Graph Manager. Eseguire quindi una query su Filter Graph Manager per l'interfaccia IMediaControl e chiamare IMediaControl::Run, come illustrato nel codice seguente:

IGraphBuilder   *pGraph = NULL;
IMediaControl   *pControl = NULL;
hr = pRender->GetFilterGraph(&pGraph);
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pControl->Run();

Usare l'interfaccia IMediaEventEx di Filter Graph Manager per attendere il completamento dell'anteprima. È anche possibile cercare il grafico usando l'interfaccia IMediaSeeking di Filter Graph Manager, proprio come si farebbe con un grafico di riproduzione file.

Per visualizzare nuovamente l'anteprima del progetto, cercare di nuovo il grafico al tempo zero e chiamare di nuovo Esegui . Se si modifica il contenuto della sequenza temporale, eseguire le operazioni seguenti:

  1. Chiamare SetRenderRange. Facoltativa
  2. Chiamare ConnectFrontEnd.
  3. Se il metodo ConnectFrontEnd restituisce S_WARN_OUTPUTRESET, chiamare RenderOutputPins. Se ConnectFrontEnd restituisce S_OK, è possibile ignorare questo passaggio.
  4. Cercare il grafico indietro al tempo zero.
  5. Eseguire il grafico.

Nell'esempio seguente vengono illustrati questi passaggi:

hr = pRender->ConnectFrontEnd();
if (hr == S_WARN_OUTPUTRESET)
{
    hr = pRender->RenderOutputPins();
}
LONGLONG llStart = 0; 
hr = pSeek->SetPositions(&llStart, AM_SEEKING_AbsolutePositioning, 0, 0); 
hr = pControl->Run();

Per un esempio completo che carica e visualizza l'anteprima di un file di progetto, vedere Caricamento e anteprima di un progetto.

Gestione di progetti di modifica video

Rendering di un progetto