SurfaceView录制视频

来源:互联网 发布:《大数据时代》电子书 编辑:程序博客网 时间:2024/06/05 12:40
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;    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppoa37锁屏密码忘了怎么办 oppor9图案密码忘了怎么办 oppor忘记锁屏图案怎么办 oppor手机忘记解锁图案怎么办 oppor手机忘记图案了怎么办 oppo手机屏幕锁忘了怎么办 三星手机屏幕锁忘了怎么办 手机主菜单坏了怎么办 索尼手机密码忘了怎么办 索尼笔记本密码忘了怎么办 索尼手机解锁密码忘了怎么办 索尼记录仪密码忘了怎么办 索尼z3手机忘记开机密码怎么办 索尼忘记锁屏密码怎么办 索尼手机忘记锁屏密码怎么办 忘了手机解锁图案怎么办 索尼手机忘记开机密码怎么办 索尼笔记本开机密码忘了怎么办 手机的开机密码忘了怎么办 联想手机开机密码忘了怎么办 红米note3忘记开机密码怎么办 小米2忘了密码怎么办 小米笔记本电脑忘记开机密码怎么办 小米笔记本忘记开机密码怎么办 小米手机儿童模式忘记密码怎么办 小米应用锁密码忘了怎么办 小米air密码忘了怎么办 小米4密码忘了怎么办 小米手机开机密码忘了怎么办? 小米笔记本电脑开机密码忘了怎么办 小米笔记本开机密码忘了怎么办 htc手机忘记解锁图案怎么办 红米手机屏幕锁定怎么解锁怎么办 小米5s有id怎么办 手机密码找不回来了怎么办? 手机密码图案忘了怎么办 手机屏幕图案锁忘了怎么办 捡到苹果7有id锁怎么办 魅族什么都忘了怎么办 海信电视百事通登陆失败怎么办 去哪儿换号了怎么办