Android AudioRecord - 以较小的文件大小录制音频

Android AudioRecord - Record Audio with small file size

我正在使用 AudioRecord 而不是 MediaRecorder 开发录音机应用程序。 我正在写这段代码来记录:

private void startRecord(){

        File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

        try {
            file.createNewFile();

            OutputStream outputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
            DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);

            int minBufferSize = AudioRecord.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

            short[] audioData = new short[minBufferSize];

            AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    8000,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minBufferSize);

            audioRecord.startRecording();

            while(recording){
                int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
                for(int i = 0; i < numberOfShort; i++){
                    dataOutputStream.writeShort(audioData[i]);
                }
            }

            audioRecord.stop();
            dataOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

一切正常。但是,我的文件很大。我录制了大约 1 分钟,我的文件大小约为 1.2M。

我尝试使用 MediaRecorder 使用此代码:

mMediaRecorder = new MediaRecorder();

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mMediaRecorder.setOutputFile(fileName);

mMediaRecorder.prepare();

mMediaRecorder.start();

很棒,录制了 5 分钟,文件大小约为 500K 或更小。但是,我必须使用 AudioRecord,因为我需要逐字节对音频应用一些任务。

当我使用 AudioRecord 时,我可以在 MediaRecorder 中使用相同的文件大小吗?

非常感谢。

实际上,使用 AudioRecord class,您可以从声源获取原始数据,而无需对您使用的字节缓冲区进行任何压缩,而 MediaRecorder class 仅提供从任何可用源录制媒体的基本功能,无需直接访问到数据缓冲区。

我假设您应该使用 AudioRecord 来捕获音频,对 AudioRecord 缓冲区中的数据应用字节到字节的任务,然后使用压缩将修改后的数据从缓冲区写入文件。我记得,android API 中没有已经实现的音频压缩功能,所以你应该使用第三方库(例如 lame) or write compression yourself. You can check this sources for audio recording in MP3 with lame: https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid