带剪辑失真的Android音频录制

带剪辑失真的Android音频录制,android,audio,recording,clipping,Android,Audio,Recording,Clipping,我是Android新手。我想录制一些音频,然后我创建了一个Android应用程序。它起作用了。 但是它录制的音频太大,容易产生剪辑失真 例如,首先我启动我的应用程序,对我的Android手机说“你好”,我得到了录音文件“recording1.pcm”;然后我从GooglePlay启动另一个录音应用程序,以相同的音量对我的Android手机说“你好”,我得到了录音文件“recording2.pcm” 然后我在试听中打开这两个文件,“recording1.pcm”(由我的应用程序录制)的波形被剪裁,

我是Android新手。我想录制一些音频,然后我创建了一个Android应用程序。它起作用了。 但是它录制的音频太大,容易产生剪辑失真

例如,首先我启动我的应用程序,对我的Android手机说“你好”,我得到了录音文件“recording1.pcm”;然后我从GooglePlay启动另一个录音应用程序,以相同的音量对我的Android手机说“你好”,我得到了录音文件“recording2.pcm”

然后我在试听中打开这两个文件,“recording1.pcm”(由我的应用程序录制)的波形被剪裁,而“recording2.pcm”(由另一个应用程序录制)的波形没有剪裁。(很抱歉,我无法嵌入图像)

录音的核心代码如下:

private class RecordAudio extends AsyncTask<Void, Integer, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            isRecording = true;
            try {
                DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));
                int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
                AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER, frequency, channelConfiguration, audioEncoding, bufferSize);
                short[] buffer = new short[bufferSize * 99];
                audioRecord.startRecording();

                int r = 0;
                while (isRecording) {
                    int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
                    for (int i = 0; i < bufferReadResult; i++) {
                        dos.writeShort(buffer[i]);
                    }

                    publishProgress(new Integer(r));
                    r++;
                }

                audioRecord.stop();
                dos.close();

            } catch (Throwable t) {
                Log.e("AudioRecord", "Recording Failed");
            }
            return null;
        }

    }
我尝试了以下方法:

  • 我更改代码
    dos.writeShort(缓冲区[I])
    to
    dos.writeShort(缓冲区[i]/2),则波形的振幅变为过去的一半,但仍存在削波失真。我认为在缓冲区获得音频数据之前,数据已经被剪裁了

  • 我浏览了“录音”的API,但没有麦克风音量的API


  • 谢谢你的帮助

    也许问题不在于音量,如果你录下非常微弱的声音会发生什么?它也被剪掉了吗?如果我录下一个非常微弱的声音,它就不会被剪掉。我的应用程序的问题是“当声音有点大的时候,很容易产生剪辑失真”。也许问题不在于音量,如果你录制了一个非常微弱的声音,会发生什么?它也被剪掉了吗?如果我录下一个非常微弱的声音,它就不会被剪掉。我的应用程序的问题是“声音稍大时容易产生剪辑失真”
    frequency = 16000;
    channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
    audioEncoding = AudioFormat.ENCODING_PCM_16BIT;