繁体   English   中英

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

[英]Recorded voice is very very low and lot of noise is recorded on 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或更高并记录下来,它将更好地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM