2012-06-18 3 views
2

저는 DirectShow에서 오디오 출력 장치를 어떻게 선택할 수 있는지 궁금합니다. DirectShow에서 오디오 출력 장치를 사용할 수 있습니다. 하지만 어떻게 이들 중 하나를 오디오 출력 장치로 만들 수 있습니까? 항상 기본 오디오 장치를 사용합니다. 내가 선택한 장치에서 오디오를 출력 할 수 있기를 원합니다. 나는 구글을 통해 어려움을 겪고 있지만 유용한 것을 찾을 수 없었다. 내가 얻을 수있는 것은 모두 this 링크 였지만 실제로는 내 문제를 해결하지 못합니다.어떻게 DirectShow에서 오디오 출력 장치를 선택할 수 있습니까

모든 도움이 정말 도움이 될 것입니다.

답변

3

오디오 장치를 관리하고 기본 장치 (예 : 제어판 애플릿을 통해)를 선택하는 것은 사용자의 책임입니다. 그러나 switch devices programmatically in Windows XP, Vista + it is impossible without interactive user action의 설계 방법을 찾을 수 있습니다. How to change default sound playback device programatically?

UPD :

도 여기 래리의 답변을 참조하십시오. 위에서 언급 한 것은 기본 오디오 출력 장치를 변경하려고하는 시스템 구성을 수정하는 것을 말합니다. 그러나 응용 프로그램은 기본 장치에만 국한되지 않습니다. 대신 사용 가능한 장치 (Using the System Device Enumerator + CLSID_AudioRendererCategory 참조)를 열거하고 BindToObject 호출을 사용하여 특정 장치에 대한 렌더러 인스턴스를 만들 수 있습니다. 거기에서, 그것은 관심있는 장치에 내부적으로 바인딩 된 정규 필터입니다.

+0

에, 오디오 파일을 재생합니다 - 사용자 상호 작용 여부와 상관없이 오히려, 질문은 분명히, 기본 이외의 오디오 장치로 출력하는 방법을 묻습니다. 예를 들어, 많은 게임/오디오 관련 앱에서, 사용자는 자신이 선택할 수있는 사용 가능한 재생 장치 목록을 포함하는 목록 상자가 제공됩니다. 선택한 장치는 응용 프로그램/게임이 오디오 출력에 사용할 장치입니다. –

+0

@ Digital_Utopia : 좋은 지적인데 이제는 더 나은 대답이 될 것입니다. –

+0

훨씬 좋음;) 업데이트를보기 전에 답을 추가했습니다. 마침내 혼자서 알아 내려고 했으므로 예제로 내 프로젝트의 스 니펫을 추가 할 것입니다. –

3

첫째로, 당신은 DirectShow를 .NET (DirectShowLib)를 사용하지 않는 경우, here는 것을 얻을 : 그것은 역할 관리되지 않는 DirectShow를 및 C#

무엇 다음 것은 꽤 간단한 예입니다 사이에 (매우 완료) 인터페이스로 어떻게 Vibhore가 기본값으로 설정 한 어떤 오디오 기기 변경하는 방법을 묻지도 않고 같은이가 "대답은"얼마나 볼 수 없습니다, 원하는 오디오 장치 개인적으로

using DirectShowLib; 

private IGraphBuilder m_objFilterGraph = null; 
private IBasicAudio m_objBasicAudio = null; 
private IMediaControl m_objMediaControl = null; 

private void playAudioToDevice(string fName, int devIndex) 
{ 
    object source = null; 
    DsDevice[] devices; 
    devices = DsDevice.GetDevicesOfCat(FilterCategory.AudioRendererCategory); 
    DsDevice device = (DsDevice)devices[devIndex]; 
    Guid iid = typeof(IBaseFilter).GUID; 
    device.Mon.BindToObject(null, null, ref iid, out source); 

    m_objFilterGraph = (IGraphBuilder)new FilterGraph(); 
    m_objFilterGraph.AddFilter((IBaseFilter)source, "Audio Render"); 
    m_objFilterGraph.RenderFile(fName, ""); 

    m_objBasicAudio = m_objFilterGraph as IBasicAudio; 
    m_objMediaControl = m_objFilterGraph as IMediaControl; 

    m_objMediaControl.Run(); 
} 
+2

이 코드에서 약한 곳은'RenderFile' 호출입니다. 예. 사전에 추가 된 렌더러를 자주 찾고 있으며,이 간단한 예제에서는 항상 그렇습니다. 대신에 핀을 직접 연결하는 것이 더 안정적입니다. 즉, 렌더러의 핀이 명시 적으로 연결될 때입니다. –

관련 문제