본문스크랩 DirectShow


  1. 소개
    1. Filter
    2. Filter Graph
  2. DirectShow 어플리케이션 작성
    1. 작성 환경 세팅
    2. Filter 작성시 추가 환경
    3. Playing the File
    4. Sample Code

소개

  • 다양한 포멧(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 인터페이스

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(); }

 


답글 남기기

이메일 주소는 공개되지 않습니다.