mCamera.unlock();
if (mMediaRecorder == null) {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOrientationHint(90);
}
if (isCameraFrontFacing()) {
mMediaRecorder.setOrientationHint(270);
}
// Step 1: Unlock and set camera to MediaRecorder
mMediaRecorder.reset();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a Camera Parameters
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* Fixed video Size: 640 * 480*/
mMediaRecorder.setVideoSize(optimalPicSize.width, optimalPicSize.height);
/* Encoding bit rate: 1 * 1024 * 1024*/
mMediaRecorder.setVideoEncodingBitRate((int) ((1.5) * 1024 * 1024));
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setAudioSamplingRate(44); // 設(shè)置音頻采樣率為44
mMediaRecorder.setAudioEncodingBitRate(64); // 設(shè)置音頻比特率為64
mMediaRecorder.setAudioChannels(1); // 設(shè)置錄制的音頻通道數(shù)
// Step 4: Set output file
mMediaRecorder.setOutputFile(savePath);
Step 1:
- setCamera參數(shù)能夠使得在預(yù)覽和錄制中快速切換,避免Camera對象的重新加載睦焕。在某些Android手機自帶的照相機程序中落君,切換預(yù)覽與錄制中的短暫卡頓梆奈,讀者可自行體會劣光。
- mMediaRecorder.setOrientationHint(90)在錄制方向為豎直(portrait)時使用袜蚕,它能使視頻文件的沿順時針方向旋轉(zhuǎn)90度,如果不設(shè)置此項绢涡,播放視頻時牲剃,畫面會發(fā)生90度的旋轉(zhuǎn)四啰。不過這里更重要的是寒匙,即使設(shè)置了此項,在某些播放器上焰轻,畫面依然會有90度的旋轉(zhuǎn)(比如將在手機上正常播放的視頻導(dǎo)入到PC中進行播放,或者嵌入H5的video標(biāo)簽中)狭归,這可是為什么呢夭坪?注意setOrientationHint的說明:Note that some video players may choose to ignore the compostion matrix in a video during playback. 那么如何做到在所有播放器上都能以正常方向播放呢文判?稍等过椎,后續(xù)專門對其進行說明。
Step 2:
- setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION)戏仓,VOICE_RECOGNITION相比于MIC會根據(jù)語音識別的需要做一些調(diào)諧疚宇,當(dāng)然,這需要在系統(tǒng)支持的情況下赏殃。
- setVideoSource自然是VideoSource.CAMERA敷待,只是在此兩項設(shè)置必須在設(shè)置編碼器之前設(shè)置,這無需說明仁热。
Step 3:
- setOutputFormat需要在Step 2之后榜揖,并且在prepare()之前。這里采用OutputFormat.MPEG_4格式抗蠢。
- setVideoSize需要權(quán)衡的因素較多举哟,主要包括三方面:MediaRecorder支持的錄制尺寸、視頻文件的大小以及兼容不同Android機型迅矛。這里采用640 * 480(微信小視頻的尺寸是320*240)妨猩,文件大小在500-1000kb之間,并且市面上99%以上機型支持此錄制尺寸秽褒。
- setVideoEncodingBitRate與視頻的清晰度有關(guān)壶硅,設(shè)置此參數(shù)需要權(quán)衡清晰度與文件大小的關(guān)系。太高销斟,文件大不易傳輸庐椒;太低,文件清晰度低蚂踊,識別率低约谈。需要根據(jù)實際業(yè)務(wù)場景靈活調(diào)整。
- setVideoEncoder采用H264編碼悴势,MPEG4窗宇、H263、H264等不同編碼的差別比較可參考http://blog.csdn.net/wcl0715/article/details/676137特纤,實際使用中军俊,H264的壓縮率較高,推薦使用捧存。
- setAudioEncoder采用AudioEncoder.AAC粪躬,該設(shè)置主要是考慮其通用性担败、兼容性。
Step 4:
- setMaxFileSize指定錄制文件的大小限制镰官,當(dāng)然還可以限制其最大錄制時間提前。
- setOutputFile指定輸出視頻的路徑。
- setOnErrorListener指定錯誤監(jiān)聽器泳唠。
總結(jié) :
- 代碼順序很重要,不按順序執(zhí)行代碼會拋異常
- setVideoEncodingBitRate 必須設(shè)置值,不設(shè)置值拍攝出來的視頻非常模糊
參考文檔 :
錄制視頻常見問題