Visualizando o projeto
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]
[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]
Para visualizar o projeto, você precisa de um componente chamado mecanismo de renderização, que cria um grafo de filtro directShow de um linha do tempo. O grafo de filtro é o que realmente renderiza o projeto. Você pode usar o mecanismo de renderização para visualizar um projeto ou gravar o arquivo de saída final.
Este artigo não entra em detalhes sobre o mecanismo de renderização. Para a versão prévia, você só precisa de algumas chamadas de método. Você pode encontrar uma discussão mais completa, incluindo como gravar arquivos de saída, em Renderizando um projeto. O exemplo de código a seguir mostra como construir um grafo de visualização.
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( );
Crie o mecanismo de renderização usando a função CoCreateInstance . Em seguida, chame os seguintes métodos na interface IRenderEngine do mecanismo de renderização:
- SetTimelineObject. Especifica o linha do tempo a ser usado.
- ConnectFrontEnd. Cria um grafo de filtro parcial, com um pino de saída para cada grupo no linha do tempo.
- RenderOutputPins. Conclui o grafo de visualização conectando cada pino de saída a um renderizador de áudio ou vídeo.
Depois que o grafo for criado, você poderá visualizar o projeto executando o grafo, como faria com qualquer grafo de filtro directShow. Primeiro, obtenha um ponteiro para o grafo de filtro chamando o método IRenderEngine::GetFilterGraph .
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
Consulte o grafo de filtro para as interfaces IMediaControl e IMediaEvent . Use essas duas interfaces para executar o grafo e aguardar a conclusão da reprodução. Para obter uma explicação de como usar essas interfaces, confira Como reproduzir um arquivo e responder a eventos. O código a seguir mostra uma maneira de usar essas 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();
O código neste exemplo bloqueia a execução do programa até que a reprodução seja concluída, devido ao parâmetro INFINITE na chamada do método IMediaEvent::WaitForCompletion . No entanto, se algo der errado durante a reprodução, isso poderá fazer com que o programa pare de responder. Em um aplicativo real, use um loop de mensagem para aguardar a conclusão da reprodução. Também é recomendável que você forneça ao usuário uma maneira de interromper a reprodução.
Quando terminar de usar o mecanismo de renderização, sempre chame o método IRenderEngine::ScrapIt . Esse método exclui o grafo de filtro e libera todos os recursos mantidos pelo mecanismo de renderização.
pRender->ScrapIt();
Tópicos relacionados