我使用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
可以使用相同的文件大小吗?
非常感谢。
答案 0 :(得分:2)
实际上,使用AudioRecord类,您可以从声源获取原始数据而无需任何压缩到您使用的字节缓冲区,MediaRecorder类仅提供从任何可用源记录媒体的基本功能,而无需直接访问数据缓冲区。
我假设您应该使用AudioRecord来捕获音频,将您的字节应用于AudioRecord缓冲区中的数据的字节任务,然后使用压缩将修改后的数据写入文件。我记得,Android API中没有用于音频压缩的功能,因此您应该使用第三方库(例如lame)或自己编写压缩。您可以使用跛脚:https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid
检查此音频来源以录制MP3音频