我在听的时候写代码录音: 我尝试在过去几天在Android智能手机上路由音频,但我找不到正确的功能 但音频输出到蓝牙的质量很低
if (mIsRecording) {
return;
}
new Thread() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int minBufferSize = AudioRecord.getMinBufferSize(
mSampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
if (minBufferSize < 0) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_GET_MIN_BUFFERSIZE);
}
return;
}
audioManager.setSpeakerphoneOn(false);
audioManager.setWiredHeadsetOn(false);
audioManager.setMode(AudioManager.MODE_CURRENT);
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
audioStream = AudioManager.STREAM_VOICE_CALL;
// "W/AudioFlinger(75): RecordThread: buffer overflow"
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
mSampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize*2);
AudioTrack track = null;
track = new AudioTrack(audioStream , mSampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
minBufferSize*2, AudioTrack.MODE_STREAM);
mEqualizer = new Equalizer(0, track.getAudioSessionId());
mEqualizer.setEnabled(true);
short bands = mEqualizer.getNumberOfBands();
short level=0;
for (short i = 0; i < bands; i++) {
final short band = i;
// System.out.println("EQUALIZER_"+i+());
switch (i) {
case 0:
level = (short)(pref.getInt(GlobalVariables.EQUALIZER_0, 0)-1500);
break;
case 1:
level = (short)(pref.getInt(GlobalVariables.EQUALIZER_1, 0)-1500);
break;
case 2:
level = (short)(pref.getInt(GlobalVariables.EQUALIZER_2, 0)-1500);
break;
case 3:
level = (short)(pref.getInt(GlobalVariables.EQUALIZER_3, 0)-1500);
break;
case 4:
level = (short)(pref.getInt(GlobalVariables.EQUALIZER_4, 0)-1500);
break;
}
// System.out.println("level"+i+level);
mEqualizer.setBandLevel(band, (short) level);
}
bb = new BassBoost (0, track.getAudioSessionId());
bb.setEnabled (true);
// Log.d("passboost",":"+pref.getInt(GlobalVariables.PASSBOOST, 10));
bb.setStrength ((short)pref.getInt(GlobalVariables.PASSBOOST, 10)); // Already in the right range 0-1000
// PCM buffer size (5sec)
// short[] buffer = new short[mSampleRate * (16 / 8) * 1 * 5]; // SampleRate[Hz] * 16bit * Mono * 5sec
short[] buffer = new short[minBufferSize]; // SampleRate[Hz] * 16bit * Mono * 5sec
// byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 1 * 1.25)];
byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 2 * 1.25)];
FileOutputStream output = null;
try {
output = new FileOutputStream(new File(mFilePath));
} catch (FileNotFoundException e) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_CREATE_FILE);
}
return;
}
// Lame init
SimpleLame.init(mSampleRate, 1, mSampleRate, 32);
if(mIsAuto)
mIsRecording = true;
else
mIsRecording = true; //
try {
try {
audioRecord.startRecording(); //
track.play();
} catch (IllegalStateException e) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_REC_START);
}
return;
}
try {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_REC_STARTED);
}
int readSize = 0;
while (mIsRecording) {
readSize = audioRecord.read(buffer, 0, minBufferSize);
track.write(buffer, 0, readSize);
// Log.d("readsize","size:"+readSize);
if (readSize < 0) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD);
}
break;
}
else if (readSize == 0) {
;
}
else {
if(mIsAuto){
//8:4,16:7,22:5,44:11
double sum = 0;
for (int i = 0; i < readSize; i++) {
sum += buffer[i] * buffer[i];
}
final double amplitude = sum / readSize;
// double level = (int)20.0*Math.log10(amplitude);//32767,65535.0
int level1 = (int) Math.sqrt(amplitude)/100;
MainActivity.levelStopRecording = (int) Math.sqrt(amplitude)/100;
if(level1<=levelSetting)
j++;
else
j=0;
MainActivity.numberForStop = j;
MainTabletActivity.numberForStop = j;
// Log.i("1","="+j);
}
int encResult = SimpleLame.encode(buffer,buffer, readSize, mp3buffer);
if (encResult < 0) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_AUDIO_ENCODE);
}
break;
}
if (encResult != 0) {
try {
output.write(mp3buffer, 0, encResult);
// Log.i("write", "==== writing ===");
} catch (IOException e) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_WRITE_FILE);
}
break;
}
}
}
}
// int flushResult = SimpleLame.flush(mp3buffer);
// if (flushResult < 0) {
// if (mHandler != null) {
// mHandler.sendEmptyMessage(MSG_ERROR_AUDIO_ENCODE);
// }
// }
// if (flushResult != 0) {
// try {
// output.write(mp3buffer, 0, flushResult);
// } catch (IOException e) {
// if (mHandler != null) {
// mHandler.sendEmptyMessage(MSG_ERROR_WRITE_FILE);
// }
// }
// }
try {
output.close();
} catch (IOException e) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR_CLOSE_FILE);
}
}
} finally {
Log.i("Finally audioRecord", "==== Stop ===");
audioRecord.stop(); //
mEqualizer.release();
bb.release();
audioRecord.release();
track.stop();
track.release();
}
} finally {
Log.i("Finally SimpleLame", "==== Close ===");
SimpleLame.close();
mIsRecording = false; //
}
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_REC_STOPPED);
}
}
}.start();
}