sw2007/02/13 11:24

약간의 코딩을 사용하여 미디어파일을 플레이하는 C++ 예제입니다.

아래는 DirectShow를 사용하여 플레이하기위한 4개의 처리과정입니다.
1. filter graph manager 인스턴스를 생성한다.
2. filter graph manager 를 사용하여 filter graph를 만든다.
3. filter graph manager 를 사용하여 filter graph를 실행한다.
4. 재생이 끝날때까지 기다린다.


이 과정을 수행하는데 필요한 인터페이스들입니다.
IGraphBuilder : filter graph를 생성
IMediaControl : filter graph의 미디어 흐름을 관리
IMediaEvent : filter graph의 이벤트를 관리
이 interface들은 모두 filter graph manager에 구현되어 있습니다.


COM 라이브러리를 초기화하는 CoInitialize를 호출해서 시작합니다. 그리고 CoCreateInstance 함수를 호출해 filter graph manager를 만듭니다.

IGraphBuilder * pGraph;
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);


CoCreateInstance 함수는 filter graph manager의 IGraphBuilder 인터페이스 포인터를 리턴합니다.
이 인터페이스 포인터를 사용하여 다른 두개의 필요한 IMediaControl과 IMediaEvent 인터페이스를 요청합니다.

IMediaControl *pMediaControl;
IMediaEvent *pEvent;
pGraph->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);


이 프로그램중에서 :

pGraph->RenderFile(L"C:\\Example.avi", NULL);
pMediaControl->Run();
pEvent->WaitForCompletion(INFINITE, &evCode);


IGraphBuilder::RenderFile 메소드는 지정한 파일을 플레이할 filter graph를 생성합니다.
첫번째 파라미터는 파일 이름이고, wide character (2바이트) 유니코드 스트링으로 넘깁니다.
단순히 예제프로그램에서는 사용자 선택 파일이름을 갖기보다 리터럴 스트링을 지정합니다.
"L" 접두사는 ASCII 스트링에서 wide character string으로 바꿉니다.
두번째 파라미터는 예비용으로 NULL 이어야 합니다.

filter graph manager로 filter graph를 생성한 후에는, 재생할 준비를 합니다.
IMediaControl::Run 메소드는 graph를 실행 모드로 바꿉니다.
어플리케이션에 이 메소드가 요청되었을때, 미디어 데이터가 filter graph를 통해 움직이기 시작하고 video, audio 를 표현합니다.

IMediaEvent::WaitForCompletion 메소드는 블록은 파일 진행이 다 되기전까지입니다.
재생을 구분된 스레드에서 계속 합니다.
실제 어플리케이션에서는 블록이 무한대가 될수 있으므로 INFINITE 로 대기 간격을 지정하는것을 피해야 합니다.
다른 filter graph 이벤트들에 반응하기를 원할것입니다. 이벤트 핸들링을 위한 더 많은 정보는 "Responding to Event"를 보면됩니다.

실제 어플리케이션에서 만들어 졌던 filter graph가 성공인지 확인하기 위해 RenderFile의 리턴값을 확인 해야만 합니다.
예를 들어 지정된 파일이존재하지 않는다면, RenderFile은 실패하고 VFW_E_NOT_FOUND 에러코드를 리턴한다.


마지막으로, 모든 인터페이스 포인터와 COM 라이브러리를 릴리징하여 해제합니다.


예제 코드
#inculde <dshow.h>

...


IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEvent *pEvent;

CoInitialize(NULL);

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);

pGraph->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);

pGraph->RenderFile(L"D:\\Test.wmv", NULL);

pMediaControl->Run();

long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);

pMediaControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();

by Redef( http://www.redef.pe.kr )

Posted by redef
TAG ,

댓글을 달아 주세요