소개
- 다양한 포멧(ASF,AVI,MP3)의 미디어 스트림을 제어할수 있는 구조체.
- 가장 기본단위의 S/W 컴포넌트 : Filter
Filter
- 파일 읽기.
- video caputure 디바이스를 통해서 video 얻기
- 각각의 스트림 포멧으로 디코딩.
- 데이터를 그래픽 혹은 사운드 카드로 전송.
Filter Graph
- 다수의 Filter가 연결된 형태.
- 파일을 입력받아 출력할때까지의 구조.
- eg.)HardDrive-> File Source(Async) -> AVI Spliter -> AVI Decompressor -> Video Renderer -> Moniter(display)
DirectShow 어플리케이션 작성
- CoCreateInstance를 통한 Filter Graph Manager Instance를 생성.
- FGM을 사용해서 filter graph를 작성.
- 스트림을 컨트롤하고 이벤트에 따라 반응.
작성 환경 세팅
- 헤더파일
- Dshow.h : 모든DirectShow어플리케이션에 필요.
- 라이브러리
- Strmiids.lib : 모든DirectShow어플리케이션에 필요.
- Quartz.lib : AMGetErrorText메서드의 호출에 필요.
- Strmbase.lib :DirectShow의 base classes를 사용할 경우만 필요.
Filter 작성시 추가 환경
- __stdcall을 사용해서 convention(구조체?)을 호출.
- 배포시에는 RELEASE, 디버그 빌드에는 DEBUG라는 프로세서 플래그를 달것.
- Set the entry-point symbol toDllEntryPoint@12.
- DLL 형태의 경우, DLL 수행에 대한 정의(.def)를 포함할것
eg.)
LIBRARY FILTER.DLL DESCRIPTION ‘Description of my filter’ PROTMODE EXPORTS DllGetClassObject DllCanUnloadNow DllRegisterServer DllUnregisterServer
Playing the File
- FGM 인스턴스 생성
- FGM으로 filter graph 생성
- FGM으로 filter graph 동작
- 플레이가 끝날때까지 기다림
- 필요한 Com 인터페이스
- IGraphBuilder: Constructs the filter graph.
- IMediaControl: Handles media streaming in the filter graph.
- IMediaEvent: Handles filter graph events.
Sample Code
#include <dshow.h> void main(void) { IGraphBuilder *pGraph; IMediaControl *pMediaControl; IMediaEvent *pEvent; CoInitialize(NULL); // IGraphBilder의 인스턴스 포인터를 리턴. CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); // IGraphBilder의 인스턴스 포인터를 통해서 나머지 인스턴스(IMediaControl, IMediaEvent)들의 인터페이스에 쿼리할수 있음. pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl); pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); // Build the graph. IMPORTANT: Change string to a file on your system. pGraph->RenderFile(L"C:\\Hello_World.avi", NULL); // Run the graph. pMediaControl->Run(); // Wait for completion. long evCode; pEvent->WaitForCompletion(INFINITE, &evCode); // Clean up. pMediaControl->Release(); pEvent->Release(); pGraph->Release(); CoUninitialize(); }