在Android上使用蓝牙录制音频时音频质量低

时间:2014-01-14 04:32:33

标签: android audio bluetooth recording

我在听的时候写代码录音: 我尝试在过去几天在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();
}

0 个答案:

没有答案