Android錄製小視訊(二)
之前講了camera的相關問題,今天把mediaRecorder總結一下
1.視訊的videoSize設定
視訊的錄製尺寸設定考慮的方面比較多,說下我在這裡碰到的一些坑。初次以camera的預覽尺寸作為videoSize的,經過測試發現,部分手機(酷派)錄製時直接崩潰了,原因是得到的bestPreviewSize不匹配該手機支援的videoSize。後來找到這個方法:getSupportVideoSize,從這個list中獲取一個與預覽尺寸同比例的寬高。這樣崩潰的問題解決了。這裡設定的videoSize比較大,拍攝的視訊清晰度也比較好。這裡還有個問題,nexus上預覽尺寸與videoSize尺寸值不一致,設定後錄製的視訊,其他手機無法播放。思考了一番,在支援的videoSize中儘量選取與預覽尺寸一致的,這樣相容會好很多。但是視訊檔案就比較大了。我用華為p7的手機,測試得到,6s視訊在2m左右。我們的視訊是要上傳到服務端的,這個視訊大小上就不符合要求了。最後參考google官方的例子,設定了640*480。視訊清晰度有所下降,但在手機上基本不影響播放的。
//Step 1: Unlock and set camera to MediaRecorder camera.unlock(); recorder.setCamera(camera); recorder.setPreviewDisplay(mSurfaceHolder.getSurface()); // Step 2: Set sources //設定採集聲音 recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); //設定採集影象 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //設定視訊,音訊的輸出格式 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //設定視訊輸出的格式和編碼 CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); recorder.setVideoSize(640, 480); //音訊一秒鐘包含多少資料位 recorder.setAudioEncodingBitRate(128); if (mProfile.videoBitRate > 2 * 1024 * 1024) { recorder.setVideoEncodingBitRate(2 * 1024 * 1024); } else { recorder.setVideoEncodingBitRate(mProfile.videoBitRate); } recorder.setVideoFrameRate(mProfile.videoFrameRate); //設定音訊的編碼格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //設定影象的編碼格式 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); recorder.setOrientationHint(resultDegrees); //設定記錄會話的最大持續時間ms recorder.setMaxDuration(6000); //Step 4: Set output file String videoPath = Constant.TALK_VIDEO_PATH + getDate() + ".mp4"; recorder.setOutputFile(videoPath);
2.MedaiaRecorder錄製過短崩潰
這裡主要是設定一個onErrorListener,處理該異常。
start的時候: recorder.setOnErrorListener(this); stop的時候,recorder.setOnErrorListener(null);
@Override
public void onError(MediaRecorder mr, int what, int extra) {
try {
if (mr != null) {
mr.reset();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.關於MediaRecorder錄製狀態改變時發出的聲音,查找了不少資料,一直沒有找到解決方案,設定禁音大部分手機是無效的。後來看到Vcamera的程式碼,原來人家就沒用系統的mediaRecorder,直接寫成檔案塊,用ffmpeg合成。這裡錄製的時候,用的寬高比3:4,錄製的視訊再用ffmpeg處理成半屏大小。這也解釋了微信為啥能半屏錄製小視訊了。