在android上需要做一個錄像留言功能,需要生成MP4或者waw格式視頻。但是使用MediaRecorder錄製出的MP4視頻格式音量太小,幾乎聽不到,且MediaRecorder提供API太少,所有隻能考慮其它方法。
試驗後的方案是分別錄製音頻和視頻,然後合成MP4格式視頻。
1、音頻錄製。通過AudioRecord錄製增益音量後的wav音頻文件。錄製wav的方法網上有很多例子,增益音量的方法在項目中的方式是使用WEBRTC中的增益模塊,我在網上還找到了另一種辦法,比較簡單,但是效果不好。
//音量大小,此種方法放大聲音會有底噪聲
audiodata[i]= (byte) (audiodata[i] * 5);//數字決定大小
參考http://blog.csdn.net/smile3670/article/details/41310241
2、MediaRecorder 錄製無聲視頻。網上例子也很多。
3、有了音頻和視頻,可以合成了。在網上找了找一些合成庫,首先找到的開源java庫mp4parser,他可以將AAC、h264、mp4等格式合成MP4。隨後找到了isoviewer-1.0-RC-35.jar(該庫包含了mp4parser),可使用它實現音視頻合成。
// mp4音視頻合成
try {
Movie countVideo = MovieCreator.build(videoMp4);
AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl(
audioAac));
countVideo.addTrack(aacTrack);
{
Container out = new DefaultMp4Builder().build(countVideo);
FileOutputStream fos = new FileOutputStream(new File(
messageRecordFile));
out.writeContainer(fos.getChannel());
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
4、由於音視頻合成的音頻是AAC格式,而之前錄製的是wav,需要轉碼成AAC。最先在網上找到的是一個java實現的通過ffmpeg在Windows和linux上轉碼的例子,但不支持android。參考其中java調用ffmpeg的方法,並將一個支持android的ffmpeg放到/system/bin/,實現了android上的轉碼。ffmpeg 轉碼命令ffmpeg -i aec_out.wav -strict -2 -b:a 32k -y abc.aac。
相關庫資源,源碼參考
http://blog.csdn.net/smile3670/article/details/41279749
錄製合成的java部分實現
http://download.csdn.net/detail/smile3670/8487683