问题
我无法让 Android 的 MediaRecorder 从连接的蓝牙麦克风录制音频。相反,录音使用设备的内置麦克风
问题
有没有人找到一种可靠的方法让 Android 的 MediaRecorder 录制来自连接的蓝牙麦克风的音频输入?
研究
早期的答案建议使用现已弃用的 startBluetoothSco()。如果没有 startBluetoothSco(),似乎无法“鼓励”Android 在设备麦克风上使用连接的蓝牙麦克风。
以下代码成功录制音频,但仅从设备麦克风录制,而不是从蓝牙麦克风录制
mediaRecorder = MediaRecorder(this).apply {
setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION) // or .MIC
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) // or MPEG_4
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
setAudioChannels(1) // Mono
setAudioSamplingRate(16000)
setOutputFile(audioOutputFile)
// use
prepare()
start()
早期经验
当 startBluetoothSco() 在我的文本转语音应用程序中被弃用时,我只是将 startBluetoothSco() 替换为合适的音频模式 (AudioManager.STREAM_MUSIC),然后 Android 将音频路由到扬声器。
下面是我用来尝试类似技巧的代码。它列出了已连接的蓝牙设备,如果它们看起来是所需的麦克风,请更改音频模式:
val bluetoothA2DPConnectedDevices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).filter { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP }
bluetoothA2DPConnectedDevices.forEach { bluetoothDevice ->
audioManager.mode = AudioManager.MODE_IN_CALL // if find a suitable Bluetooth device try changing audio mode
}
我尝试了多种 AudioManager 模式,但没有一个能够使用外部麦克风进行录音
任何人都可以建议我还可以尝试什么吗?
我找到的解决方案在创建 mediaRecorder = MediaRecorder(this).apply {}
之前使用 setCommunicationsDevice()搜索并选择任何合适的蓝牙连接的外部麦克风
val availableCommunicationsDevices = audioManager.availableCommunicationDevices
availableCommunicationsDevices.forEach { device ->
if (device.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) {
audioManager.setCommunicationDevice(device)
}
}
然后使用原始问题中显示的代码来设置 MediaRecorder
注意: 虽然 MediaRecorder 有一个方法 setPreferredDevice() 我无法让 MediaRecorder 使用该设备。