1. 程式人生 > >Android錄製小視訊(二)

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處理成半屏大小。這也解釋了微信為啥能半屏錄製小視訊了。