Android录制小视频(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/denglusha737/article/details/70338055

之前讲了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处理成半屏大小。这也解释了微信为啥能半屏录制小视频了。








猜你喜欢

转载自blog.csdn.net/denglusha737/article/details/70338055