gpt4 book ai didi

Android 蓝牙音频播放和录制

转载 作者:太空狗 更新时间:2023-10-29 14:55:38 55 4
gpt4 key购买 nike

我有一个蓝牙耳机(可以播放立体声音乐)连接到我的安卓手机(安卓 4.4.3)。现在我希望我的代码能够以高采样率 (44100) 播放立体声音乐并从该耳机录制音频。我遵循了以下帖子中的解决方案。

How to record sound using bluetooth headset

Capture Audio through Bluetooth Headset paired with Android Device

我的基本代码如下所示。

权限:

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.RECORD_AUDIO
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.BROADCAST_STICKY
android.permission.BLUETOOTH

开启蓝牙Sco的代码:

m_amAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

public void turnOnBluetooth() {
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
System.err.println("bluetooth connected");
unregisterReceiver(this);
} else if (AudioManager.SCO_AUDIO_STATE_DISCONNECTED == state) {
System.err.println("bluetooth disconnected");
}
}
};

registerReceiver(broadcastReceiver, new IntentFilter(
AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));

try {
if (m_amAudioManager.isBluetoothScoAvailableOffCall()) {
if (m_amAudioManager.isBluetoothScoOn()) {
m_amAudioManager.stopBluetoothSco();
m_amAudioManager.startBluetoothSco();
System.err.println("Bluetooth SCO On!");
} else {
System.err.println("Bluetooth Sco Off!");
m_amAudioManager.startBluetoothSco();
}

} else {
System.err.println("Bluetooth SCO not available");
}
} catch (Exception e) {
System.err.println("sco elsepart startBluetoothSCO " + e);
unregisterReceiver(broadcastReceiver);
}
}

播放立体声音乐的代码:

public void playMusic(){
this.mediaPlayer = new MediaPlayer();
this.mediaPlayer
.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
this.mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().
getAbsolutePath()+ "/"+ folderName + "/stereo.wav");
// change type to STREAM_VOICE_CALL can partly solve the problem
// but reduces the quality of the music, which is critical in my case
this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.mediaPlayer.prepare();
this.mediaPlayer.start();
}

录音代码:

public void recordAudio() {
AudioRecorder recorder = new AudioRecord(
audioSource, // MediaRecorder.AudioSource.MIC
RECORDER_SAMPLERATE, // 44100
RECORDER_CHANNELS, // AudioFormat.CHANNEL_IN_MONO
RECORDER_AUDIO_ENCODING, // AudioFormat.ENCODING_PCM_16BIT
bufferSize // obtained by AudioRecord.getMinBufferSize()
);
int i = recorder.getState();
if (i == 1)
recorder.startRecording();
// then read bytes from the recorder
}

这里的问题是什么。

情况 1:如果我调用以下序列

turnOnBluetooth();
playMusic();
recordAudio();

音乐通过手机的扬声器而不是蓝牙耳机播放。录音机可以录制蓝牙耳机麦克风的声音,但采样率非常低(8kHz)。

情况 2:如果我不调用 turnOnBluetooth(),即执行以下序列

playMusic();
recordAudio();

现在通过蓝牙耳机播放音乐,但录音机只录制手机内置麦克风的音频。

我还尝试通过以下方式更改 AudioManager 的模式

m_amAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

并设置音频路由

m_amAudioManager.setSpeakerphoneOn(false);
m_amAudioManager.setBluetoothScoOn(true);

结果与情况1相同。如果我设置

m_amAudioManager.setBluetoothScoOn(false);

它重复了情况 2。

我已经为此工作了几天,上面的行为让我很困惑。我错过了音频设置中的任何内容吗?或者我是否需要对蓝牙耳机的设置进行更复杂的控制?感谢您阅读本文,欢迎提出任何建议。谢谢!

最佳答案

这可能为时已晚,但这是我的解决方案。

您需要按如下方式设置媒体记录器

mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setOutputFile(AudioSavePathInDevice);

为了在蓝牙耳机上播放,您需要打开蓝牙并关闭扬声器

audioManager.setBluetoothScoOn(true);
audioManager.startBluetoothSco();

audioManager.setSpeakerphoneOn(false);
audioManager.setMode(audioManager.MODE_NORMAL);

要以 8KHz 的其他频率进行录音,您需要使用 AudioRecorder 类

new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, audioBufferSize);

关于Android 蓝牙音频播放和录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31799693/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com