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

时间:2016-09-18 06:32:55

标签: android audio mediarecorder audiorecord

我使用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,因为我需要逐个字节地应用一些任务。

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

非常感谢。

1 个答案:

答案 0 :(得分:2)

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

我假设您应该使用AudioRecord来捕获音频,将您的字节应用于AudioRecord缓冲区中的数据的字节任务,然后使用压缩将修改后的数据写入文件。我记得,Android API中没有用于音频压缩的功能,因此您应该使用第三方库(例如lame)或自己编写压缩。您可以使用跛脚:https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid

检查此音频来源以录制MP3音频