프로젝트 미리 보기
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, 그리고 Media Foundation의 오디오/비디오 캡처 에 의해 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
[이 API는 지원되지 않으며 나중에 변경되거나 사용할 수 없습니다.]
프로젝트를 미리 보려면 타임라인에서 DirectShow 필터 그래프를 빌드하는 렌더링 엔진라는 구성 요소가 필요합니다. 필터 그래프는 실제로 프로젝트를 렌더링합니다. 렌더링 엔진을 사용하여 프로젝트를 미리 보거나 최종 출력 파일을 작성할 수 있습니다.
이 문서에서는 렌더링 엔진에 대해 자세히 설명하지 않습니다. 미리 보기의 경우 몇 가지 메서드 호출만 필요합니다. 프로젝트렌더링에서 출력 파일을 작성하는 방법을 포함하여 보다 자세한 설명을 찾을 수 있습니다. 다음 코드 예제에서는 미리 보기 그래프를 생성하는 방법을 보여줍니다.
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( );
CoCreateInstance 함수를 사용하여 렌더링 엔진을 만듭니다. 그런 다음, 렌더링 엔진의 IRenderEngine 인터페이스에서 다음 메서드를 호출합니다.
- SetTimelineObject. 사용할 타임라인을 지정합니다.
- ConnectFrontEnd. 타임라인의 각 그룹에 대해 하나의 출력 핀을 사용하여 부분 필터 그래프를 작성합니다.
- RenderOutputPins. 각 출력 핀을 비디오 또는 오디오 렌더러에 연결하여 미리 보기 그래프를 완료합니다.
그래프가 빌드되면 DirectShow 필터 그래프와 마찬가지로 그래프를 실행하여 프로젝트를 미리 볼 수 있습니다. 먼저 IRenderEngine::GetFilterGraph 메서드를 호출하여 필터 그래프에 대한 포인터를 가져옵니다.
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
IMediaControl 및 IMediaEvent 인터페이스에 대한 필터 그래프를 쿼리합니다. 이 두 인터페이스를 사용하여 그래프를 실행하고 재생이 완료되기를 기다립니다. 이러한 인터페이스를 사용하는 방법에 대한 설명은 파일 재생 방법 및 그리고 이벤트에 응답하기 를 참조하세요. 다음 코드에서는 이러한 인터페이스를 사용하는 한 가지 방법을 보여 줍니다.
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();
이 예제의 코드는 IMediaEvent::WaitForCompletion 메서드 호출의 INFINITE 매개 변수로 인해 재생이 완료될 때까지 프로그램 실행을 차단합니다. 그러나 재생 중에 문제가 발생하면 프로그램이 응답하지 않을 수 있습니다. 실제 애플리케이션에서 메시지 루프를 사용하여 재생이 완료될 때까지 기다립니다. 또한 재생을 중단할 수 있는 방법을 사용자에게 제공하는 것이 좋습니다.
렌더링 엔진 사용을 마치면 항상 IRenderEngine::ScrapIt 메서드를 호출합니다. 이 메서드는 필터 그래프를 삭제하고 렌더링 엔진에서 보유한 모든 리소스를 해제합니다.
pRender->ScrapIt();
관련 항목