다음을 통해 공유


오디오 캡처 그래프 만들기

[이 페이지와 연결된 기능, DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용한 기존 코드를 다시 작성하여 새 API를 사용하는 것을 추천합니다.]

오디오 캡처 애플리케이션의 첫 번째 단계는 필터 그래프를 빌드하는 것입니다. 그래프의 구성은 만들려는 파일 형식에 따라 달라집니다.

  • 오디오 전용 AVI 파일: 오디오 캡처 필터에서 AVI Mux 필터로, AVI Mux에서 파일 작성기 필터로.
  • WAV 파일: 오디오 캡처 필터에서 WavDest 필터 샘플 에서 파일 작성기 필터로
  • windows Media Audio(.wma) 파일: WM ASF 기록기 필터에 대한 오디오 캡처 필터입니다.

WavDest 필터는 SDK 샘플로 제공됩니다. 이를 사용하려면 필터를 빌드하고 등록해야 합니다.

ASF 기록기 필터를 사용하려면 Windows Media SDK를 설치하고 소프트웨어 키를 가져와 필터의 잠금을 해제해야 합니다. 자세한 내용은 DirectShow에서 Windows 미디어 사용을 참조 하세요.

캡처 그래프 작성기 개체를 사용하여 필터 그래프를 빌드하거나 "수동으로" 그래프를 빌드할 수 있습니다. 즉, 애플리케이션이 각 필터를 프로그래밍 방식으로 추가하고 연결하게 합니다. 이 문서에서는 수동 방법을 설명합니다. 캡처 그래프 작성기 사용에 대한 자세한 내용은 비디오 캡처를 참조하세요. 해당 문서의 대부분의 정보는 오디오 전용 그래프에 적용됩니다.

오디오 캡처 디바이스 추가

오디오 캡처 필터는 특정 하드웨어 디바이스와 통신하므로 단순히 CoCreateInstance를 호출하여 필터를 만들 수 없습니다. 대신 시스템 디바이스 열거자를 사용하여 클래스 식별자 CLSID_AudioInputDeviceCategory 식별되는 "오디오 캡처 원본" 범주의 모든 디바이스를 열거합니다.

시스템 디바이스 열거자는 디바이스에 대한 모니커 목록을 반환합니다. 각 모니커의 친숙한 이름은 디바이스의 이름에 해당합니다. 반환된 모니커 중 하나를 선택하고 이를 사용하여 해당 디바이스에 대한 오디오 캡처 필터의 인스턴스를 만듭니다. 필터 그래프에 필터를 추가합니다. 사용자가 선호하는 오디오 녹음 장치가 모니커 목록에 먼저 표시됩니다. (사용자는 제어판 소리 및 멀티미디어를 클릭하여 기본 설정 디바이스를 선택합니다.)

자세한 내용은 시스템 디바이스 열거자 사용을 참조 하세요.

캡처할 입력을 지정하려면 오디오 캡처 필터에서 IAMAudioInputMixer 인터페이스를 가져오고 put_Enable 메서드를 호출하여 입력을 지정합니다. 그러나 이 방법의 한 가지 제한 사항은 다른 하드웨어 디바이스가 다른 문자열을 사용하여 입력을 식별할 수 있다는 것입니다. 예를 들어 한 카드는 "마이크"를 사용하여 마이크 입력을 식별하고 다른 카드는 "마이크"를 사용할 수 있습니다. 지정된 입력에 대한 문자열 식별자를 확인하려면 Windows 멀티미디어 함수 waveOutOpen, mixerOpen mixerGetLineInfo를 사용합니다. 자세한 내용은 Mixer 디바이스 쿼리를 참조하세요.

멀티플렉서 및 파일 기록기 추가

오디오 캡처 그래프에는 멀티플렉서와 파일 작성기가 포함되어야 합니다.

멀티플렉서는 하나 이상의 스트림을 특정 형식의 단일 스트림으로 결합하는 필터입니다. 예를 들어 AVI Mux 필터는 오디오 및 비디오 스트림을 인터리브된 AVI 스트림으로 결합합니다. 오디오 캡처의 경우 일반적으로 단일 오디오 스트림만 있지만 오디오 데이터는 여전히 멀티플렉서가 필요한 디스크에 저장할 수 있는 형식으로 패키지되어야 합니다. 멀티플렉서의 선택은 대상 형식에 따라 달라집니다.

  • AVI: AVI 멀티플렉서
  • WAV: WavDest
  • WMA: ASF 기록기

파일 작성 기는 들어오는 데이터를 파일에 쓰는 필터입니다. AVI 또는 WAV 파일의 경우 파일 작성기 필터사용합니다. WMA 파일의 경우 ASF 기록기는 멀티플렉서 및 파일 작성기 역할을 합니다.

필터를 만들고 그래프에 추가한 후 오디오 캡처 필터의 출력 핀을 멀티플렉서의 입력 핀에 연결하고 멀티플렉서의 출력 핀을 필터 작성기 입력 핀에 연결합니다(별도의 필터라고 가정). 파일 이름을 지정하려면 IFileSinkFilter 인터페이스에 대한 파일 작성기를 쿼리하고 IFileSinkFilter::SetFileName 메서드를 호출합니다.

코드 예

다음 예제에서는 WavDest 필터를 사용하여 오디오 캡처 그래프를 빌드하는 방법을 보여줍니다. 다른 파일 형식에는 동일한 원칙이 적용됩니다.

IBaseFilter *pSrc = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;

// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void**)&pGraph);

// This example omits error handling.

// Not shown: Use the System Device Enumerator to create the 
// audio capture filter.

// Add the audio capture filter to the filter graph. 
hr = pGraph->AddFilter(pSrc, L"Capture");

// Add the WavDest and the File Writer.
hr = AddFilterByCLSID(pGraph, CLSID_WavDest, L"WavDest", &pWaveDest);
hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWriter);

// Set the file name.
hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
hr = pSink->SetFileName(L"C:\\MyWavFile.wav", NULL);

// Connect the filters.
hr = ConnectFilters(pGraph, pSrc, pWaveDest);
hr = ConnectFilters(pGraph, pWaveDest, pWriter);

// Not shown: Release interface pointers.

이 예제에서는 CLSID로 필터 추가에 설명된 함수와 ConnectFilters Connect Two Filters에 설명된 함수를 사용합니다AddFilterByCLSID. 둘 다 DirectShow API가 아니어도 됩니다.

오디오 캡처