录制的声音非常非常低,而且在Android上录制了很多噪音



我正在尝试使用AudioRecord类和写作记录语音使用AudioTrack类读取到扬声器的字节。我能听见声音来自扬声器,但声音很低,很多噪音伴随着录制的声音。

任何解决这个问题的方法都可以减少噪音和噪音实际的声音。

我使用下面的代码:

    package com.my.mic.record;
    import android.media.AudioFormat;
    import android.media.AudioManager;
    import android.media.AudioRecord;
    import android.media.AudioTrack;
    import android.media.MediaRecorder;
    import android.util.Log;
    public class Record extends Thread
    {
           int numCrossing,p,numSamples,af;
           static final int bufferSize = 200000;
           short[] buffer = new short[bufferSize];
           short[] readBuffer = new short[bufferSize];
           boolean isRecording;
           AudioManager am;
           public AudioRecord arec;
           public AudioTrack atrack;
           private int sampleRate = 8000;

           public void run() {

                   isRecording = true;
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
                   int buffersize =
    AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_16BIT);
                   arec = new
    AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,
                                   buffersize);
                   //buffersize = arec.getMinBufferSize(arec.getSampleRate(),
    arec.getChannelConfiguration(), arec.getAudioFormat());
                   atrack = new
    AudioTrack(AudioManager.STREAM_MUSIC,arec.getSampleRate(),arec.getChannelConfiguration(),arec.getAudioFormat(),
                                   buffersize,AudioTrack.MODE_STREAM);
                   am.setRouting(AudioManager.MODE_NORMAL,AudioManager.ROUTE_EARPIECE,
    AudioManager.ROUTE_ALL);
                   //am.setMode(AudioManager.MODE_NORMAL);

                   Log.d("SPEAKERPHONE", "Is speakerphone on? : " +
    am.isSpeakerphoneOn());
                   atrack.setPlaybackRate(sampleRate);

                   byte[] buffer = new byte[buffersize];
                   arec.startRecording();
                   atrack.play();
                   //atrack.setStereoVolume(atrack.getMaxVolume(),
    atrack.getMaxVolume());
                   final float frequency = sampleRate;
           float increment = (float)((2*Math.PI) * frequency / 44100); //
    angular increment for each sample
           float angle = 0;
           //AndroidAudioDevice device = new AndroidAudioDevice( );
                   while(isRecording) {
                           try {
                                   arec.read(buffer, 0, buffersize);
                                   atrack.write(buffer, 0, buffer.length);
                           } catch (Exception e) {
                                   Log.d("Record", ""+e);
                           }
                   }
                   arec.stop();
                   atrack.stop();
                   //device.releaseTrack();
                   isRecording = false;
           }

           public boolean isRecording() {
                   return isRecording;
           }
           public void setRecording(boolean isRecording) {
                   this.isRecording = isRecording;
           }
           public AudioManager getAm() {
                   return am;
           }
           public void setAm(AudioManager am) {
                   this.am = am;
           }
       public void stopRecording(){
               arec.stop();
       arec.release();
       atrack.stop();
       atrack.release();
       arec=null;
       atrack=null;
       setRecording(false);
       this.stop();
       }
}

转到这个工作音频记录示例,如果您在模拟器中测试,那么采样率将默认为8000。对于设备,将采样率提高到44100或更高并记录,它将更好地工作。

最新更新