2013-04-02 3 views
5

이것은 Stackoverflow의 첫 번째 게시물입니다. 지난 며칠 동안 안드로이드 스마트 폰에서 오디오를 라우팅하려고 시도하지만 제대로 수행 할 수있는 기능을 찾지 못했습니다.Android - 스마트 폰과 블루투스 모듈간에 오디오를 라우팅하는 기능

블루투스 아기 폰용입니다.

스마트 폰과 블루투스 모듈 사이를 라우팅해야합니다. 블루투스 모듈은 처음에는 핸드셋, 차량용 핸즈프리, 무선 스피커를 만들기 위해 사용됩니다.

프로젝트의 오디오쪽에 대해 A2DP 및 HFP (Handfree) 프로파일과 통신합니다.

장치간에 "sco"연결 (오디오 Bluetooth 교환과 함께 사용되는 연결)을 설정하고 Bluetooth 모듈에서 오디오를 가져올 수 있습니다. 그러나 "sco"연결이 작동 중일 때 스마트 폰에서 스피커와 마이크를 더 이상 사용할 수 없습니다.

내 스마트 폰에서 오디오를 사용하고 동시에 내 Bluetooth 모듈의 오디오를 사용하는 솔루션을 찾고 싶습니다.

http://developer.android.com/index.html에서 오디오 라우팅 기능을 검색했습니다.

AudioManager 클래스에는 setRouting 또는 setParameters와 같이 오디오를 라우팅하는 몇 가지 기능이 있지만 아직 결과가 있습니다. http://developer.android.com/reference/android/media/AudioManager.html

당신은 내가 babyphone 측 (블루투스 모듈 측)에서 오디오를 얻기 위해 사용하는 코드 아래에 볼 수 있습니다

: 나는 스마트 폰 스피커로 라우팅하지 오디오와가에서 "SCO"연결을 사용할 수있는 경우

boolean isRecording=true; 
int buffersize = 8000; 
byte[] buffer = new byte[buffersize]; 

//audio configuration and SCO Bluetooth connection. 
AudioManager aManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
android.os.Process.setThreadPriority(
      android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
aManager.startBluetoothSco(); 
aManager.setBluetoothScoOn(true); 
aManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 

//AudioRecord configuation for recording audio from babyphone. 
AudioRecord arec = new AudioRecord(
      MediaRecorder.AudioSource.VOICE_COMMUNICATION, 
      8000, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, 
      buffersize); 

//AudioTrack configuation for sending audio to smartphone speaker.     
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
       8000, 
       AudioFormat.CHANNEL_OUT_MONO, 
       AudioFormat.ENCODING_PCM_16BIT, 
       buffersize, 
       AudioTrack.MODE_STREAM); 

atrack.setPlaybackRate(8000); 

//start audio recording and playing. 
arec.startRecording(); 
atrack.play(); 

while(isRecording) { 
    arec.read(buffer, 0, buffersize); 

    atrack.write(buffer, 0, buffer.length); 
} 

arec.stop(); 
atrack.stop() 

같은 시간에 아기 측면의 마이크에서 오디오를 되찾기 위해 가능한 빨리 프로젝트의 방향을 변경해야합니다.

가능한 경우 최신 스마트 폰에서 스마트 폰 측의 베이비 프로그램을 실행해야합니다.

영어가 제 첫 번째 언어가 아니기 때문에 일부 문장이 올바르지 않을 수 있습니다.

나는 어떤 해결책이든 열려 있습니다.

+0

행운을 빕니다. 블루투스 헤드셋의 마이크를 PA 시스템으로 사용하려고합니다. 즉, 재생은 잭 (출력)을 통해 이루어져야합니다 (다른 블루투스 장치로는 불가능할 것 같음). – Diego

답변

1

A2DP는 미디어 재생 용이며 단방향입니다. SCO는 BT를 통한 음성 통화/VoIP/녹음에 사용되며 양방향이지만 품질은 낮습니다.

당신이 BluetoothSco을 활성화하고 IN_CALL에 모드를 설정하거나 IN_COMMUNICATIONSTREAM_VOICE_CALL이 BT_SCO 출력 장치로 라우팅 될 것입니다, 때 (대부분의 ON/내가 함께 작업 한 모든 장치가 적어도) 입력 장치 것 무슨 일이 일어날 지 BT_SCO 입력 장치를 의미하는 출력 장치 (모드 때문에)를 기준으로 선택해야합니다.

내 제안 - 모든 장치에서 작동한다고 보장 할 수는 없지만 이 아닌IN_COMMUNICATION으로 설정됩니다. setBluetoothScoOn(true) 호출은 BT_SCO에 녹음하기 위해 "강제 사용"설정을 내부적으로 설정하고 또는 VOICE_RECOGNITION AudioSource를 사용하여 녹음을 BT_SCO 마이크를 녹음 장치로 선택해야합니다.
그러나 BT_SCO와 내장 마이크에서 동시에 녹음하는 것은 휴대용 방식으로는 불가능할 수도 있습니다.
RING, ALARM 또는 MUSIC 스트림 유형을 사용할 수 있습니다.이 유형은 음성 통화가 아닌 경우 BT_SCO가 아닌 내부 라우드 스피커로 라우팅되어야합니다.

+0

@ user2235813 아마 AudioSource.CAMCORDER가 내부 마이크를 사용하는 두 번째 레코더를 열 수 있습니다. – Schlangi

관련 문제