Android中小视频录制,预览

工作中项目需求,在动态里面支持查看录制的小视频;录制视频主要用到Android中MediaRecorder这个类,在录制的过程中需要结合SurfaceView和Camera,Camera管理手机摄像头,SurfaceView负责将Camera捕捉到的图像渲染出来,MediaRecorder类则相当于这两者之间的枢纽,负责协调。

一、主要功能:

视频录制,可设置录制最大时长和最小时长,支持横屏竖屏录制,视频预览(录制出来的视频格式都是MP4格式。因为只是录制视频,所以对视频的后期处理都没有做,比如视频压缩,裁剪等等,这些可能都需要使用ffmpeg命令。个人感觉这个ffmpeg功能是强大,但是依赖包也挺大的,在我的项目中,拍摄出来的10s的视频大概16M的样子,就没压缩,只用到了裁剪,而裁剪我使用的是isoviewer-1.0-RC-27.jar这个jar包)

二、预览:视频录、预览、横屏录、预览

               


三、代码分析

1.视频录制的主要代码

 /**
     * 初始化
     * @throws IOException
     */
    @SuppressLint("NewApi")
    private void initRecord() throws IOException {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.reset();
        if (mCamera != null)
            mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setOnErrorListener(this);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 视频源
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 音频源

        //注释掉的代码官方说这样的配置方法是Android2.2以下使用
//		mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
//		mMediaRecorder.setAudioEncoder(AudioEncoder.AAC);// 音频格式:AAC兼容会高点
//      mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置视频编码:h264在常见的网页上都可播放
//		mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
//		mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 1024*100);// 设置帧频率

        //Android2.2以上直接用MediaRecorder.setProfile得到统一的配置
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_720P));
        mMediaRecorder.setOrientationHint(mRotationRecord);// 输出旋转90度,保持竖屏录制
        mMediaRecorder.setOutputFile(mRecordFile.getAbsolutePath());
        try {
            mMediaRecorder.prepare();
            mMediaRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这里主要初始化录制参数,然后开始录制,注释掉的代码是2.2以前配置视频参数,在以后只需要setProfile(CamcorderProfile.get(CamcorderProfile))这个方法代替,这个会自动获取手机里面已经配置好的参数,而CamcorderProfile里面的几个参数,视情况而定,推荐 QUALITY_HIGH,直接获取手机里面支持的最高分辨率;setOrientationHint()设置视频的输出角度,这个可以控制录制出来的视频是否是横屏还是竖屏,等下说明;setOutputFile()录制的视频保存地址;


2.停止录制

/**
     * 停止录制
     */
    public void stopRecord() {
        if (mMediaRecorder != null) {
            // 设置后不会崩
            mMediaRecorder.setOnErrorListener(null);
            mMediaRecorder.setPreviewDisplay(null);
            try {
                mMediaRecorder.stop();
                mMediaRecorder.release();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (RuntimeException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

3.监控手机横竖屏录制

//手机旋转监听
        OrientationEventListener orientationEventListener=new OrientationEventListener(this) {
            @Override
            public void onOrientationChanged(int rotation) {
                //录制的过程不改变
                if(isRecording){
                    return;
                }
                if (((rotation >= 0) && (rotation <= 30)) || (rotation >= 330)) {
                    // 竖屏拍摄
                    mRotationRecord=90;
                } else if (((rotation >= 230) && (rotation <= 310))) {
                    // 横屏拍摄
                    mRotationRecord=0;
                } else if (rotation > 30 && rotation < 95) {
                    // 反横屏拍摄
                    mRotationRecord=180;
                }
            }
        };
        orientationEventListener.enable();

这里使用到的是OrientatinEvenListener手机方向事件监听器,rotation表示手机旋转角度,垂直为0,顺时针角度逐渐增加;通过对rotation的监听可以知道当前手机是竖直,横屏,还是反横屏,从而改变mRotationRecord(就是设置视频输出角度的参数),


到此视频录制的代码也就这么多了,其中录制视频的圆形按钮可以看看我的另一片博客,视频预览的代码我没有贴出,下面直接给出源码,可能很多做的不是很到,更多的是供新手参考,录制视频该怎么做,以及视频该怎么做


下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值