MediaUtils
1: Android 的 MediaRecorder 相信用過的同學(xué)一定踩過很多坑
2: 之前寫的代碼很亂,現(xiàn)在重構(gòu)了一下,可以直接放到自己的項目中用
3:本例子將 MediaRecorder 進(jìn)行了重構(gòu),通過 MediaUtils 對外暴露幾個必需的方法來實現(xiàn)錄像和錄音功能
4:錄制視頻界面參考新版微信小視頻,還原了微信的動畫效果
5:支持 Android 7.0
6:通過線程及 Exception 等手段避免了常見的 start failed , stop failed 等問題
7:重繪了錄制視頻和錄音時的兩個自定義view,可在原本基礎(chǔ)上進(jìn)行二次開發(fā)
8:提供了視頻截圖方法,支持雙擊放大,支持自動對焦
9:視頻錄制暫時使用 SurfaceView + Camera , 后續(xù)會升級為 TextureView + Camera2
效果圖
核心類
MediaUtils
重構(gòu)后對外暴露只有8行代碼,可結(jié)合實際情況使用
// 初始化
MediaUtils mediaUtils = new MediaUtils(this);
mediaUtils.setRecorderType(MediaUtils.MEDIA_VIDEO);
mediaUtils.setTargetDir(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES));
mediaUtils.setTargetName(UUID.randomUUID() + ".mp4");
mediaUtils.setSurfaceView(surfaceView);
// 開始錄制
mediaUtils.record()
// 結(jié)束錄制 save or unSave
mediaUtils.stopRecordUnSave();
mediaUtils.stopRecordSave();
CameraHelper
在 Android 中錄制視頻時顯示的 Size 和實際拍照的 Size 是由 Camera 所決定的,最好的方法是計算出可支持的 PreviewSize 和 VideoSize 計算出一個合適的size,同時根據(jù)自己視頻的用途,選擇合理的 Size
CameraHelper 參考自 GoogleCameraSample 幫助你計算出合適的 Size
CamcorderProfile
這是一個困擾我好久的地方,一直在想錄制視頻的時候,如何保存清晰度的情況下,還能控制文件的大小,終于找到了一種可行的辦法
分辨率越大視頻大小越大,比特率越大視頻越清晰
清晰度由比特率決定,視頻尺寸和像素量由分辨率決定
比特率越高越清晰(前提是分辨率保持不變),分辨率越大視頻尺寸越大
CamcorderProfile 是 Android 提供的一個內(nèi)置的視頻參數(shù)配置類
videoFrameWidth 錄制視頻分辨率的寬
videoFrameHeight 錄制視頻分辨率的高
videoBitRate 這個就是比特率,決定了視頻的清晰度
將分辨率和比特率結(jié)合自己的需求,進(jìn)行有效的控制,可以的到自己想要的效果
本 demo 中,錄制1080P的視頻,大小在5M左右,還可以再小
最后 videoFrameRate 幀率,這個一般是攝像頭會自動調(diào)節(jié),所以設(shè)置了恒定的有的也不起作用
自定義View
仿造新版微信拍攝視頻的界面,通過 Paint,RectF,Canvas 繪制,很簡單直接看代碼就好了
突然喜歡上了在 Android 畫動效,開啟 dribbble 抄動效模式