Android录制小视频(二)

来源:互联网 发布:淘宝装修市场 编辑:程序博客网 时间:2024/05/17 04:23

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








0 0