【问题标题】:Android - Function to route audio between smartphone and bluetooth moduleAndroid - 在智能手机和蓝牙模块之间路由音频的功能
【发布时间】:2013-04-02 15:04:15
【问题描述】:

这是我在 Stackoverflow 上的第一篇文章。 在过去的几天里,我尝试在 Android 智能手机上路由音频,但我找不到正确执行此操作的功能。

用于制作蓝牙婴儿电话。

我需要在智能手机和蓝牙模块之间建立路由。蓝牙模块最初用于制作Handset、汽车免提、无线音箱...

我与项目音频方面的 A2DP 和 HFP(免提)配置文件进行通信。

我可以在设备之间建立“sco”连接(用于音频蓝牙交换的连接)并从蓝牙模块取回音频。但是当连接“sco”正常工作时,我无法再使用智能手机上的扬声器和麦克风。

我希望找到一种解决方案,既可以在我的智能手机上使用音频,又可以在我的蓝牙模块上使用音频。

我在http://developer.android.com/index.html 上搜索了路由音频的功能。

AudioManager 类有一些函数来路由音频,如 setRouting 或 setParameters,但我还有任何结果。 http://developer.android.com/reference/android/media/AudioManager.html

您可以在下面看到我用来从 babyphone 端(蓝牙模块端)获取音频的代码:

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

如果我无法将音频路由到智能手机扬声器并同时使用“sco”连接从婴儿手机端的麦克风取回音频,我需要尽快知道它以改变我的项目方向。

如果可能,智能手机端的 babyphone 程序需要在所有最近的智能手机上运行。

英语不是我的母语,所以有些句子可能不正确。

我愿意接受任何解决方案。

【问题讨论】:

  • 运气好吗?我正在尝试将蓝牙耳机的麦克风用作 PA 系统,换句话说,播放应该通过插孔(输出),(我猜想通过另一个蓝牙设备是不可能的)。好像没办法啊

标签: android audio routing bluetooth


【解决方案1】:

A2DP 用于媒体播放,并且是单向的。 SCO 用于通过 BT 进行语音通话/VoIP/录音,是双向的,但质量较低。

当您启用 BluetoothSco 并将模式设置为 IN_CALLIN_COMMUNICATION 时会发生什么(至少在我使用过的大多数/所有设备上)STREAM_VOICE_CALL 将被路由到 BT_SCO 输出设备,输入设备将根据输出设备(由于模式)选择,即BT_SCO输入设备。

我的建议 - 尽管我不能保证它适用于所有设备 - 不要将模式设置为 IN_COMMUNICATIONsetBluetoothScoOn(true) 调用将在内部将“强制使用”设置为录音设置为 BT_SCO,并结合使用 DEFAULTVOICE_RECOGNITION AudioSource 应选择 BT_SCO 麦克风作为录音设备。
但是,同时从 BT_SCO 和内置麦克风录音可能无法以便携方式进行。
对于输出,您可以使用 RINGALARMMUSIC 流类型,当不在语音通话中时,它们应路由到内部扬声器而不是 BT_SCO。

【讨论】:

  • @user2235813 也许 AudioSource.CAMCORDER 可以打开第二个使用内部麦克风的录音机。
  • @Michael,通过蓝牙路由呼叫适用于 pjsip,但由于在蓝牙连接设备上接收到的呼叫没有在蓝牙耳机或耳机上获得铃声,也没有在汽车蓝牙上。任何人都有任何想法或建议。任何帮助或建议将不胜感激。
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多