我有一个蓝牙耳机(可以播放立体声音乐)连接到我的android手机(android 4.4.3)。现在,我希望我的代码能够播放立体声音乐并从耳机中录制音频,这两种方式的采样率都很高(44100)。我在以下帖子中遵循了这些解决方案。
如何使用蓝牙耳机录制声音
通过与Android设备配对的蓝牙耳机捕获音频
我的基本代码如下所示。
权限:
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
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setOutputFile(AudioSavePathInDevice);
要使用蓝牙耳机,您需要打开bluetoothsco并关闭扬声器
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);
大家好,我正在尝试使用两个独立的媒体播放器实例播放音频和视频文件。当我从一开始播放它时,它工作得很好。但当我寻找时,我可以看到音频和视频的延迟 这是我寻找音频和视频的代码 //sikAudio(msec); if(media播放器!=null) { // 没有直播流,如果(medialayer.get持续时间() }
点击录音按钮,并且一直按住不放,开始录音。录音时会有图标显示声音大小的波动。松开录音按钮时,则停止录音。点击播放按钮开始播放所录声音。 [Code4App.com]
我一直无法让应用程序录制音频,同时让iPhone音乐应用程序通过蓝牙扬声器播放。 例如,如果我这样做: 然后音乐应用程序将开始通过iPhone内置的扬声器播放音乐,而不是通过蓝牙。换句话说,似乎没有办法在应用程序中录制音频的同时还允许通过蓝牙播放音乐。 如果我删除AVAudioSessionColloryOptionDefaultToSpeaker,那么音频路由将切换到接收器。这比让它通过iPho
我想创建一个能够接收音频流的Android应用程序。我曾想过使用A2DP配置文件,但似乎Android不支持A2DP接收器。看起来有很多人在寻找这个问题的解决方案。但是,如果接收一个普通的位流,然后在应用程序中将数据转换成音频呢?我想通过RFCOMM(SPP蓝牙模式)接收PCM或Mp3数据流,然后使用AudioTrack播放。 首先,我如何通过RFCOMM在我的Android手机上接收比特流?是否
我对同一主题进行了研究,发现android设备是a2dp源,音频只能从a2dp源流式传输到a2dp接收器。A2dp接收器可以是蓝牙耳机或蓝牙扬声器。 但我的问题是,Android应用程序“蓝牙音乐播放器”是如何工作的? 它允许从一部手机到另一部手机进行流媒体传输。因此,在这种情况下,收听移动设备必须充当接收器。这怎么可能?他们是否使用其他配置文件而不是a2dp? 好吧,这可能是他们使用的不同配置文
我想使用android<code>MediaPlayer</code>将文件中的音频播放到手机的耳机(或已连接的耳机)中。我尝试使用本文中建议的MODE_IN_CALL hack-Android-通过耳机播放音频,但没有帮助。该应用程序还具有android.com权限。MODIFY_AUDIO_SETTINGS权限,但对<code>m_amAudioManager的任何调用。无线电话(假) 被忽略