//MP4视频录制设置 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);//视频源 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//输出格式; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//视频解码器;
//MP3音频录制设置audioRecorder = new MediaRecorder(); audioRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/Snoppa/pano_tmp/" + "mp3.mp3"); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
有了音频和视频,可以合成了。在网上找了找一些合成库,首先找到的开源java库mp4parser,他可以将AAC、h264、mp4等格式合成MP4。随后找到了isoviewer-1.0-RC-35.jar(该库包含了mp4parser),可使用它实现音视频合成。
mp4parser估计已经是在子线程里做了,保险起见再次放到子线程里去做(1.7G的视频合并用了50多秒,有点慢~~降低编码率可以加快速度,但是清晰度降低了)
new Thread(new Runnable() { @Override public void run() { //mp4音视频合成 try { //转菊花 Message message = Message.obtain(); message.what = MAKEVIDEO_ING; handler.sendMessage(message); Movie countVideo = MovieCreator.build(Environment.getExternalStorageDirectory() + "/Snoppa/pano_tmp/" + "mp4.mp4"); AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl(Environment.getExternalStorageDirectory() + "/Snoppa/pano_tmp/" + "mp3.mp3")); countVideo.addTrack(aacTrack); Container out = new DefaultMp4Builder().build(countVideo); FileOutputStream fos = new FileOutputStream(new File(cacheVideoFilePath)); out.writeContainer(fos.getChannel()); fos.close(); //合成成功 Message message1 = Message.obtain(); message1.what = MAKEVIDEO_SUCC; handler.sendMessage(message1); } catch (Exception e) { //合成失败 Message msg = Message.obtain(); msg.what = MAKEVIDEO_FAIL; handler.sendMessage(msg); Logger.d(TAG, e.toString()); e.printStackTrace(); } finally { File mp3_file = new File(Environment.getExternalStorageDirectory() + "/Snoppa/pano_tmp/" + "mp3.mp3"); if (mp3_file.exists()) { mp3_file.delete(); } File mp4_file = new File(Environment.getExternalStorageDirectory() + "/Snoppa/pano_tmp/" + "mp4.mp4"); if (mp4_file.exists()) { mp4_file.delete(); } } } }).start();