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
我正在使用 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