录制小视频,一定要注意的参数

        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); // 设置音频采样率为44
        mMediaRecorder.setAudioEncodingBitRate(64); // 设置音频比特率为64
        mMediaRecorder.setAudioChannels(1); // 设置录制的音频通道数

        // Step 4: Set output file
        mMediaRecorder.setOutputFile(savePath);
Step 1:
  1. setCamera参数能够使得在预览和录制中快速切换,避免Camera对象的重新加载。在某些Android手机自带的照相机程序中,切换预览与录制中的短暂卡顿,读者可自行体会。
  2. mMediaRecorder.setOrientationHint(90)在录制方向为竖直(portrait)时使用,它能使视频文件的沿顺时针方向旋转90度,如果不设置此项,播放视频时,画面会发生90度的旋转。不过这里更重要的是,即使设置了此项,在某些播放器上,画面依然会有90度的旋转(比如将在手机上正常播放的视频导入到PC中进行播放,或者嵌入H5的video标签中),这可是为什么呢?注意setOrientationHint的说明:Note that some video players may choose to ignore the compostion matrix in a video during playback. 那么如何做到在所有播放器上都能以正常方向播放呢?稍等,后续专门对其进行说明。
Step 2:
  1. setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION),VOICE_RECOGNITION相比于MIC会根据语音识别的需要做一些调谐,当然,这需要在系统支持的情况下。
  2. setVideoSource自然是VideoSource.CAMERA,只是在此两项设置必须在设置编码器之前设置,这无需说明。
Step 3:
  1. setOutputFormat需要在Step 2之后,并且在prepare()之前。这里采用OutputFormat.MPEG_4格式。
  2. setVideoSize需要权衡的因素较多,主要包括三方面:MediaRecorder支持的录制尺寸、视频文件的大小以及兼容不同Android机型。这里采用640 * 480(微信小视频的尺寸是320*240),文件大小在500-1000kb之间,并且市面上99%以上机型支持此录制尺寸。
  3. setVideoEncodingBitRate与视频的清晰度有关,设置此参数需要权衡清晰度与文件大小的关系。太高,文件大不易传输;太低,文件清晰度低,识别率低。需要根据实际业务场景灵活调整。
  4. setVideoEncoder采用H264编码,MPEG4、H263、H264等不同编码的差别比较可参考http://blog.csdn.net/wcl0715/article/details/676137,实际使用中,H264的压缩率较高,推荐使用。
  5. setAudioEncoder采用AudioEncoder.AAC,该设置主要是考虑其通用性、兼容性。
Step 4:
  1. setMaxFileSize指定录制文件的大小限制,当然还可以限制其最大录制时间。
  2. setOutputFile指定输出视频的路径。
  3. setOnErrorListener指定错误监听器。
总结 :
  1. 代码顺序很重要,不按顺序执行代码会抛异常
  2. setVideoEncodingBitRate 必须设置值,不设置值拍摄出来的视频非常模糊
参考文档 :

录制视频常见问题

推荐阅读更多精彩内容