SurfaceView录制视频

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    private Camera camera;
    private Context context;
    private SurfaceHolder surfaceHolder;
    private boolean isRunning = false;
    private MediaRecorder mediaRecorder;
    //====================================
    private boolean mStartedFlg = false;
    private String path = "";

    public CameraView(Context context) {
        super(context);
        initData(context);
    }

    public CameraView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initData(context);
    }

    public CameraView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context);
    }

    private void initData(Context context) {
        this.context = context;
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(this);
//        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        startPreView(surfaceHolder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        if (mediaRecorder != null) {
            mediaRecorder.release();
            mediaRecorder = null;
        }
        releaseCamera();
    }

    public void starRecordVideo() {
        if (!mStartedFlg) {
            if (mediaRecorder == null) {
                mediaRecorder = new MediaRecorder();
            }
            try {
                /**
                 * 解锁camera
                 * 设置输出格式为mpeg_4(mp4),此格式音频编码格式必须为AAC否则网页无法播放
                 */
                camera.unlock();
                mediaRecorder.setCamera(camera);
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                //音频编码格式对应应为AAC
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
                //视频编码格式对应应为H264
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                mediaRecorder.setVideoSize(640, 480);
                mediaRecorder.setVideoEncodingBitRate(600 * 1024);
                mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

                /**
                 * 设置输出地址
                 */
                String sdPath = getSDPath();
                if (sdPath != null) {
                    File dir = new File(sdPath + "/VideoAndAudio");
                    if (!dir.exists()) {
                        dir.mkdir();
                    }
                    path = dir + "/" + getDate() + ".mp4";
                    mediaRecorder.setOutputFile(path);
                    mediaRecorder.setOrientationHint(90);
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                    mStartedFlg = true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            if (mStartedFlg) {
                try {
                    mediaRecorder.stop();
                    mediaRecorder.reset();
                    mStartedFlg = false;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            mStartedFlg = false;
        }
    }

    /**
     * 开启预览
     *
     * @param holder
     */
    private void startPreView(SurfaceHolder holder) {
        try {
            if (camera == null) {
                camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
            }
            if (mediaRecorder == null) {
                mediaRecorder = new MediaRecorder();
            }
            if (mediaRecorder != null) {
                camera.setDisplayOrientation(90);
                camera.setPreviewDisplay(holder);
                Camera.Parameters parameters = camera.getParameters();
                /**
                 * Camera自动对焦
                 */
                List<String> focusModes = parameters.getSupportedFocusModes();
                if (focusModes != null) {
                    for (String mode : focusModes) {
                        mode.contains("continuous-video");
                        parameters.setFocusMode("continuous-video");
                    }
                }
                camera.setParameters(parameters);
                camera.startPreview();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onPause() {
        mStartedFlg = false;
        // 如果正在使用MediaRecorder,首先需要释放它。
        releaseMediaRecorder();
        // 在暂停事件中立即释放摄像头
        releaseCamera();
    }


    private void releaseMediaRecorder() {
        if (mediaRecorder != null) {
            // 清除recorder配置
            mediaRecorder.reset();
            // 释放recorder对象
            mediaRecorder.release();
            mediaRecorder = null;
            // 为后续使用锁定摄像头
            camera.lock();
        }
    }

    private void releaseCamera() {
        if (camera != null) {
            // 为其它应用释放摄像头
            camera.release();
            camera = null;
        }
    }

    /**
     * 获取系统时间
     *
     * @return
     */
    public static String getDate() {
        Calendar ca = Calendar.getInstance();
        int year = ca.get(Calendar.YEAR);           // 获取年份
        int month = ca.get(Calendar.MONTH);         // 获取月份
        int day = ca.get(Calendar.DATE);            // 获取日
        int minute = ca.get(Calendar.MINUTE);       // 分
        int hour = ca.get(Calendar.HOUR);           // 小时
        int second = ca.get(Calendar.SECOND);       // 秒
        String date = "" + year + (month + 1) + day + hour + minute + second;
        Log.d("date", "date:" + date);
        return date;
    }

    /**
     * 获取SD path
     *
     * @return
     */
    public String getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()
                .equals(Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
            return sdDir.toString();
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值