Android錄製小視訊(三)
阿新 • • 發佈:2018-12-08
之前的文章講到半屏錄製小視訊,不過微信不已經全屏了麼,我們的專案也要與時俱進不是。在仿微信全屏錄製的過程中,有兩點需要注意的地方:
1.camera的預覽大小設定
這個依然採取以前的策略,在支援的預覽大小中,選擇與當前螢幕寬高比最相近的一個preViewSize,保證surfaceView中畫面不會太失真。經過測試發現,手機支援的預覽尺寸裡還是有很接近螢幕寬高比的,這也可能是機子在設計之初就考慮到了全屏的情況了。
2.錄製完結束後,使用mediaPlayer迴圈播放,直至使用者選擇確定按鈕。
這裡需要注意的地方是,錄製結束後,要釋放資源,尤其是surfaceHolder。MediaRecorder與camer先後釋放出holder後,將其交給MediaPlayer,這樣就可以播放了。如果需要重新錄製,MediaPlayer釋放holder,camera獲取即可。
/** * 停止錄製:異常返回false */ public boolean stopRecorderVideo() { handler.removeCallbacks(mTimestampRunnable); endTime = System.currentTimeMillis(); if (recorder == null || !isRunning) { return false; } try { //避免錄製過短崩潰 recorder.setOnErrorListener(null); recorder.setPreviewDisplay(null); recorder.stop(); recorder.reset(); //釋放資源 recorder.release(); recorder = null; camera.stopPreview(); camera.setPreviewDisplay(null); isRunning = false; iVideoRecorder.videoRecordStop(getVideoFilePath(), getVideoFileLongTime(), getVideoSyncFrame()); } catch (Exception e) { e.printStackTrace(); iVideoRecorder.videoRecordError(); return false; } return true; }
這裡需要注意的是:camera釋放holder時,需要停止預覽,否則有的手機會黑屏,無法交接holder了。
另外在camera開發的過程中,容易報:Camera is being used after Camera.release(),需要在釋放資源前,surfaceHolder.removeCallback(this).如果camera設定了PreviewCallback,在釋放時,設定為空,以免報錯。