錄制小視頻,一定要注意的參數(shù)

        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:
  1. setCamera參數(shù)能夠使得在預(yù)覽和錄制中快速切換,避免Camera對象的重新加載。在某些Android手機(jī)自帶的照相機(jī)程序中,切換預(yù)覽與錄制中的短暫卡頓,讀者可自行體會。
  2. mMediaRecorder.setOrientationHint(90)在錄制方向為豎直(portrait)時使用,它能使視頻文件的沿順時針方向旋轉(zhuǎn)90度,如果不設(shè)置此項,播放視頻時,畫面會發(fā)生90度的旋轉(zhuǎn)。不過這里更重要的是,即使設(shè)置了此項,在某些播放器上,畫面依然會有90度的旋轉(zhuǎn)(比如將在手機(jī)上正常播放的視頻導(dǎo)入到PC中進(jìn)行播放,或者嵌入H5的video標(biāo)簽中),這可是為什么呢?注意setOrientationHint的說明:Note that some video players may choose to ignore the compostion matrix in a video during playback. 那么如何做到在所有播放器上都能以正常方向播放呢?稍等,后續(xù)專門對其進(jìn)行說明。
Step 2:
  1. setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION),VOICE_RECOGNITION相比于MIC會根據(jù)語音識別的需要做一些調(diào)諧,當(dāng)然,這需要在系統(tǒng)支持的情況下。
  2. setVideoSource自然是VideoSource.CAMERA,只是在此兩項設(shè)置必須在設(shè)置編碼器之前設(shè)置,這無需說明。
Step 3:
  1. setOutputFormat需要在Step 2之后,并且在prepare()之前。這里采用OutputFormat.MPEG_4格式。
  2. setVideoSize需要權(quán)衡的因素較多,主要包括三方面:MediaRecorder支持的錄制尺寸、視頻文件的大小以及兼容不同Android機(jī)型。這里采用640 * 480(微信小視頻的尺寸是320*240),文件大小在500-1000kb之間,并且市面上99%以上機(jī)型支持此錄制尺寸。
  3. setVideoEncodingBitRate與視頻的清晰度有關(guān),設(shè)置此參數(shù)需要權(quán)衡清晰度與文件大小的關(guān)系。太高,文件大不易傳輸;太低,文件清晰度低,識別率低。需要根據(jù)實際業(yè)務(wù)場景靈活調(diào)整。
  4. setVideoEncoder采用H264編碼,MPEG4、H263、H264等不同編碼的差別比較可參考http://blog.csdn.net/wcl0715/article/details/676137,實際使用中,H264的壓縮率較高,推薦使用。
  5. setAudioEncoder采用AudioEncoder.AAC,該設(shè)置主要是考慮其通用性、兼容性。
Step 4:
  1. setMaxFileSize指定錄制文件的大小限制,當(dāng)然還可以限制其最大錄制時間。
  2. setOutputFile指定輸出視頻的路徑。
  3. setOnErrorListener指定錯誤監(jiān)聽器。
總結(jié) :
  1. 代碼順序很重要,不按順序執(zhí)行代碼會拋異常
  2. setVideoEncodingBitRate 必須設(shè)置值,不設(shè)置值拍攝出來的視頻非常模糊
參考文檔 :

錄制視頻常見問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容