Visualizando um projeto

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

[Essa API não tem suporte e pode ser alterada ou indisponível no futuro.]

Para visualizar um projeto, primeiro chame CoCreateInstance para criar uma instância do Mecanismo de Renderização Básico. O identificador de classe é CLSID_RenderEngine. Em seguida, chame o método IRenderEngine::SetTimelineObject para especificar o linha do tempo que você está renderizando.

Na primeira vez que você visualizar o linha do tempo, execute as seguintes chamadas na ordem listada:

  1. Chame IRenderEngine::SetRenderRange para especificar qual parte do linha do tempo para visualização. (Opcional)
  2. Chame IRenderEngine::ConnectFrontEnd para criar o front-end do grafo.
  3. Chame IRenderEngine::RenderOutputPins. Esse método conecta cada pino de saída a um renderizador de vídeo ou renderizador de áudio, concluindo o grafo.

O exemplo de código a seguir mostra estas etapas:

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

Agora, execute o grafo de filtro. Primeiro, chame o método IRenderEngine::GetFilterGraph para recuperar um ponteiro para a interface IGraphBuilder do Filter Graph Manager. Em seguida, consulte o Gerenciador de Grafo de Filtro para a interface IMediaControl e chame IMediaControl::Run, conforme mostrado no código a seguir:

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

Use a interface IMediaEventEx do Filter Graph Manager para aguardar a conclusão da visualização. Você também pode procurar o grafo usando a interface IMediaSeeking do Gerenciador de Grafo de Filtro, assim como faria com um grafo de reprodução de arquivo.

Para visualizar o projeto novamente, procure o grafo de volta ao tempo zero e chame Executar novamente. Se você alterar o conteúdo do linha do tempo, faça o seguinte:

  1. Chame SetRenderRange. (Opcional)
  2. Chame ConnectFrontEnd.
  3. Se o método ConnectFrontEnd retornar S_WARN_OUTPUTRESET, chame RenderOutputPins. (Se ConnectFrontEnd retornar S_OK, você poderá ignorar esta etapa.)
  4. Procure o grafo de volta ao tempo zero.
  5. Execute o grafo.

O exemplo a seguir mostra estas etapas:

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

Para obter um exemplo completo que carrega e visualiza um arquivo de projeto, consulte Carregando e visualizando um projeto.

Gerenciando projetos de edição de vídeo

Renderizando um projeto