android 拍照及录视频简单的实例

来源:互联网 发布:shuttle mac 编辑:程序博客网 时间:2024/06/07 06:39

拍照实现步骤:
<1>界面使用SurfaceView控件,显示照相机的画面
<2>SurfaceView接受摄像头界面变化的信息
surfaceView.getHolder().addCallback()
<3>重写三个方法
surfaceDestroyed—>当预览界面关闭时,触发
一般在这里执行销毁照相机的操作,释放内存
camera.stopPreview();
camera.release();
camera = null;
surfaceCreated—–>预览界面被创建时,调用
一般在这里打开照相机和设置照相机的一些参数

        // 打开摄像头        camera = Camera.open();        // 给摄像头设置参数        Parameters parameters = camera.getParameters();        // 设置每秒3栈        parameters.setPreviewFrameRate(3);        // 设置照片的输出格式        parameters.setPictureFormat(PixelFormat.JPEG);        // 设置照片的质量        parameters.set("jpeg-quality", 85);        // 给照相机设置参数        camera.setParameters(parameters);        //将摄像头的画面显示到SurfaceView控件上        camera.setPreviewDisplay(sv_main_camera.getHolder());        // 开始预览        camera.startPreview();    surfaceChanged----->当预览界面的格式和大小发生改变时,触发<4>保存    camera.takePicture    将照片保存到内存卡(压缩)

2.视频录制
实现步骤:
<1>将视频动画显示到SurfaceView控件上
<2>使用MediaRecorder类进行视频的录制
常用的方法:
mediaRecorder.reset();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setVideoFrameRate(3); //每秒3帧
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
File videoFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+”.3gp”);
mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
mediaRecorder.prepare();//预期准备
mediaRecorder.start();//开始刻录
mediaRecorder.stop();//停止刻录

注意:权限

<!--打开照相机权限--><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" />

拍照代码如下:

public class MainActivity extends AppCompatActivity {    private SurfaceView sv_main_surface;    private Camera camera;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sv_main_surface = (SurfaceView)findViewById(R.id.sv_main_surface);        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;                }            }        });    }    public void takePhoto(View view){        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/G150820_"+System.currentTimeMillis()+".png");                    bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);                    camera.stopPreview();                    camera.startPreview();                } catch (FileNotFoundException e) {                    e.printStackTrace();                }            }        });    }}

录视频代码:

public class MediarecorderActivity extends AppCompatActivity {    private SurfaceView sv_recorder_surface;    private MediaRecorder mediaRecorder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mediarecorder);        sv_recorder_surface = (SurfaceView) findViewById(R.id.sv_recorder_surface);        //实例化媒体录制器        mediaRecorder = new MediaRecorder();    }    public void start(View view){        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/G150820_"+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;        }    }}
1 0
原创粉丝点击