DirectShow DirectShow 의 사용법 오디오 캡춰 오디오 캡춰 그래프의 생성   [목차열람] [주소복사] [슬롯비우기]
오디오 캡춰 그래프의 생성
 
Microsoft DirectX 9.0

오디오 캡춰 그래프의 생성

오디오 캡춰 애플리케이션을 위해서(때문에), 우선 필터 그래프를 생성 한다. 그래프의 구성은 생성 하는 파일의 타입에 따라서 다르다.

WavDest 필터는 SDK 샘플로서 제공되고 있다. 사용하려면 , 필터를 생성 해 등록할 필요가 있다.

ASF 라이터 필터를 사용하려면 , Windows Media SDK 를 인스톨 해, 소프트웨어 키를 취득해 필터의 잠금을 해제할 필요가 있다. 더 자세한 정보는, 「Windows Media 애플리케이션」을 참조할것.

필터 그래프는,Capture Graph Builder 개체를 사용해 생성 할 수 있다. 또,"수동" 에서도 그래프를 생성 할 수 있다. 즉, 애플리케이션으로 프로그램적으로 각 필터를 추가하거나 접속하거나 할 수 있다. 여기에서는, 수동의 방법을 설명한다. Capture Graph Builder 의 사용의 더 자세한 정보는, 「비디오 캡춰」를 참조할것. 그 정보의 상당수는, 오디오 전용 그래프에도 적용할 수 있다.

오디오 캡춰 장치의 추가

오디오 캡춰 필터는 특정의 하드웨어 장치와 통신하기 위해(때문에), 단지 CoCreateInstance 를 호출해도 필터는 생성 할 수 없다. 대신에,System Device Enumerator 를 사용해 "오디오 캡춰 소스" 카테고리의 모든 장치를 열거한다. 이 카테고리는 클래스 식별자 CLSID_AudioInputDeviceCategory 에 의해 식별된다.

System Device Enumerator 는 장치의 모니카의 일람을 돌려준다. 각 모니카의 프렌들리명은 장치명에 대응한다. 돌려주어진 모니카의 1 개를 선택해, 모니카를 사용해 그 장치에 대한 오디오 캡춰 필터의 인스턴스를 생성 한다. 필터 그래프에 필터를 추가한다. 사용자의 우선 오디오 녹음 장치가 모니카 일람의 선두에 온다. (사용자가 우선 장치를 선택하려면 , 컨트롤 패널의 [사운드와 멀티미디어] 를 클릭한다. )

더 자세한 정보는, 「System Device Enumerator 의 사용법」을 참조할것.

멀티플렉서와 파일 라이터의 추가

오디오 캡춰 그래프에는 멀티플렉서와 파일 라이터를 짜넣을 필요가 있다.

"멀티플렉서" 는 1 개 또는 복수의 스트림을 조합해 특정의 포맷을 가지는 1 개의 스트림을 생성 하는 필터이다. 예를 들어, AVI Mux 필터는 오디오 스트림과 비디오 스트림을 조합해 인터리브 된 AVI 스트림을 생성 한다. 오디오 캡춰에서는, 보통 1 개의 오디오 스트림 밖에 없다. 그러나, 오디오 데이터를 디스크에 보존할 수 있는 포맷에 압축할 필요가 있어, 그 때에 멀티플렉서가 필요하게 된다. 선택할 수 있는 멀티플렉서는 대상 포맷에 따라서 다르다.

"파일 라이터" 는 파일에 수신 데이터를 기입하는 필터이다. AVI 파일 또는 WAV 파일에는,파일 라이터 필터를 사용한다. WMA 파일에는, ASF 라이터가 멀티플렉서와 파일 라이터의 양쪽 모두의 역할을 완수한다.

필터를 생성 해, 그래프에 추가한 후, 오디오 캡춰 필터의 출력 핀을 멀티플렉서의 입력 핀에 접속해, 멀티플렉서의 출력 핀을 필터 라이터의 입력 핀에 접속한다 (이것들은 다른 필터이라고 가정한다). 파일명을 지정하려면 , 파일 라이터로 IFileSinkFilter 인터페이스를 문의해IFileSinkFilter::SetFileName 메서드를 호출한다.

샘플 코드

다음 예는 WavDest 필터를 사용해 오디오 캡춰 그래프를 생성 하는 방법을 나타내고 있다. 다른 파일 타입에도 같은 원칙이 적용된다.

IBaseFilter *pSrc = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
// 필터 그래프 매니저를 생성 한다.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void**) &pGraph);

// 생략 : 시스템 장치 열거자를 사용해 오디오 캡춰 
// 필터를 생성 한다.

// 필터 그래프에 오디오 캡춰 필터를 추가한다.
pGraph->AddFilter(pSrc, L"Capture");

// WavDest 와 파일 라이터를 추가한다.
AddFilterByCLSID(pGraph, CLSID_WavDest, L"WavDest", &pWavDest);
AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWriter);

// 파일명을 설정한다.
pWriter->QueryInterface(IID_IFileSinkFilter, (void**) &pSink);
pSink->SetFileName(L"C:\\MyWavFile.wav", NULL);

// 필터를 접속한다.
ConnectFilters(pGraph, pSrc, pWavDest);
ConnectFilters(pGraph, pWavDest, pWriter);

이 예에서는, 「CLSID 에 의한 필터의 추가」로 설명하고 있는 AddFilterByCLSID 함수, 및 「2 개의 필터의 접속」으로 설명하고 있는 ConnectFilters 함수를 사용하고 있다. 어느쪽이나 DirectShow API 는 아니다.

↑TOP