Android --- 多媒体应用 Camera(照相、摄影)

Camera

一、摄像

1 、打开摄像头

private void openCamera(){
        //获取摄像头数量
        int size = Camera.getNumberOfCameras();
        for (int i = 0; i<size;i++){
            //获取摄像头的信息
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(i,info);
            //判断类型
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK){
                camera = Camera.open(i);
                break;
            }
        }
    }

需要权限:

<uses-permission android:name="android.permission.CAMERA"/>

2 、设置预览画面( SurfaceView/TextureView )

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        //打开摄像机
        openCamera();
        //设置预览画面
        if (null != camera) {
            try {
                //3.0以前可以使用SurfaceView预览
                //  camera.setPreviewDisplay(SurfaceHolder);
                //android 3.0之后的方法
                camera.setPreviewTexture(surface);
                //设置
                Camera.Parameters par = camera.getParameters();
                par.setPictureFormat(PixelFormat.JPEG);
                //par.setPictureSize(640,480);
                camera.setParameters(par);
                //预览角度
                camera.setDisplayOrientation(90);
                //预览监听
                camera.setPreviewCallback(new Camera.PreviewCallback() {
                    @Override
                    public void onPreviewFrame(byte[] data, Camera camera) {

                    }
                });
                //开始预览
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3 、预览

//开始预览
camera.startPreview();

4 、拍照

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.take_pic:
                if (null != camera) {
                    // 第一个参数表示快门回调
                    // 第二个参数表示原始图像数据回调
                    // 第三个参数表示预览数据的回调(经过压缩的)
                    camera.takePicture(null, null, pictureCallback);
                }
                break;
        }
    }

5 、处理图像

private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
            //将图像旋转90°,使图像和预览画面一致
            Matrix m = new Matrix();
            m.setRotate(90);
            //基于原图创建一个新图像(新图像使用Matrix旋转90度)
            Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);
            //保存图像
            try {
                FileOutputStream out = new FileOutputStream("mnt/sdcard/" + System.currentTimeMillis() + ".jpg");
                b2.compress(Bitmap.CompressFormat.JPEG, 100, out);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            //回收原图
            b.recycle();
        }
    };

注意:退出时一定要释放摄像头

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        if (null != camera) {
            camera.stopPreview();
            camera.release();
            camera = null;
        }
        return true;
    }


二、视频录制

1 、打开摄像头,设置预览画面,开始预览

2 、配置 MediaRecorder

    private MediaRecorder mRecoder;

    private void startRecoder() {
        if (mCamera != null) {
            //解锁摄像头
            mCamera.unlock();
            mRecoder = new MediaRecorder();
            mRecoder.setCamera(mCamera);
            //角度旋转为90度
            mRecoder.setOrientationHint(90);
            //配置画面来源和音频来源
            mRecoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //设置系统标准配置
            mRecoder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P));
            //输出格式
            mRecoder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            //设置录制编码
            mRecoder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            //录制的帧率
            mRecoder.setVideoFrameRate(20);
            mRecoder.setVideoEncodingBitRate(1024*1024);
            //设置分辨率
            mRecoder.setVideoSize(640, 480);
            //保存位置
            mRecoder.setOutputFile(Environment.getExternalStorageDirectory().toString()+"/"+System.currentTimeMillis()+".3gp");
            try {
                mRecoder.prepare();
                mRecoder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3、停止录制

    @Override
    public void onClick(View v) {
            case R.id.btn_stop_rec:
                if(null != mRecoder){
                    mRecoder.stop();
                    mRecoder.release();
                    mRecoder = null;
                }
                if(null != mCamera){
                    mCamera.lock();
                    mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                }
                break;
        }
    }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值