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:
- Chame IRenderEngine::SetRenderRange para especificar qual parte do linha do tempo para visualização. (Opcional)
- Chame IRenderEngine::ConnectFrontEnd para criar o front-end do grafo.
- 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:
- Chame SetRenderRange. (Opcional)
- Chame ConnectFrontEnd.
- Se o método ConnectFrontEnd retornar S_WARN_OUTPUTRESET, chame RenderOutputPins. (Se ConnectFrontEnd retornar S_OK, você poderá ignorar esta etapa.)
- Procure o grafo de volta ao tempo zero.
- 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.
Tópicos relacionados