照相机(Camera)与视频录制(MediaRecorder)

来源:互联网 发布:java rc4加密 编辑:程序博客网 时间:2024/04/26 15:58

            虽然手机中有自带的拍照与录像功能,但是免不了的我们在软件开发中的需要用到这两个功能。往往我们很容易忽略

这两个功能是如何实现的。像现在很多软件有人脸识别功能,只要一打开软件照相功能就自启动。当然在手机中同一时刻相机

只能被一个软件启动,这是我们该注意的细节。像这样好玩的东西当然不能错过。

           相机功能比较好实现,关键要记住它不同的参数。

           首先 我们用一个特定的控件SurfaceView来装载人像。

           然后SurfaceView接受摄像头界面变化的信息:

                    surfaceView.getHolder().addCallback();

            接下来重写三个方法:

                       sv_main_surface.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override

             // 预览界面被创建时调用,一般在这里打开照相机和设置照相机的一些参数
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                //打开照相机
                camera = Camera.open();
                //设置参数
                Camera.Parameters parameters=camera.getParameters();

               // 设置照片的输出格式
                parameters.setPictureFormat(PixelFormat.JPEG);

                // 设置照片的质量
                parameters.set("jpeg-quality",85);

                // 给照相机设置参数
                camera.setParameters(parameters);


                //将画面展示到SurfaceView
                try {
                    camera.setPreviewDisplay(sv_main_surface.getHolder());
                } catch (IOException e) {
                    e.printStackTrace();
                }

                //开启预览效果
                camera.startPreview();
            }

            @Override

            // 当预览界面的格式和大小发生改变时,触发
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {


            }

            @Override

           //当预览界面关闭时,触发

            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

                 //一般在这里执行销毁照相机的操作,释放内存
                if(camera!=null){
                    camera.stopPreview();
                    camera.release();
                    camera=null;
                }
            }
        });

     


       最后就是保存成像的图片:

               camera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, Camera camera) {
                //技术:图片压缩技术
                Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);

                try {
                    FileOutputStream fos=new FileOutputStream("/mnt/sdcard/Wwoo0"+System.currentTimeMillis()+".png");
                    bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);
                    camera.stopPreview();
                    camera.startPreview();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }


            }
        });


       相机功能就大概可以实现了。接下来是视频录制,这个原理也差不多,同样的记住不同的参数是关键。

       第一步也是用一个SurfaceView显示视频动画

       然后使用MediaRecorder类进行视频录制,实例化一个MediaRecorder视频录制器,然后由一个开始

       按钮控制开始参数设置:

                   mediaRecorder.reset();

                    //从照相机采集视频
                   mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                   mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 

                  //设置格式
                   mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);


                  mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
                  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);


                //设置保存路径
                 mediaRecorder.setOutputFile("/mnt/sdcard/Wwoo0"+System.currentTimeMillis()+".mp4");


                 mediaRecorder.setPreviewDisplay(sv_recorder_surface.getHolder().getSurface());


                 try {

                          //预期准备
                         mediaRecorder.prepare();

                         //开始刻录
                         mediaRecorder.start();
                 } catch (IOException e) {
                          e.printStackTrace();
                 }

        自然由一个结束按钮控制录制结束

               public void stop(View view){
                        if(mediaRecorder!=null){
                                    mediaRecorder.stop();
                                    mediaRecorder.release();
                                    mediaRecorder=null;
                              }

                }


     那么一个照相与一个录制功能也就快实现了,之所以是快呢,还有配置清单文件部分没有完成

                   <!-- 打开照相机的权限 -->
                   <uses-permission android:name="android.permission.CAMERA" />

                   <!--文件写进内存卡权限-->
                   <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
                   <!--读内存卡文件权限-->                  

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

                    <!--打开录像机权限-->
                   <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>







4 0
原创粉丝点击