您当前的位置: 首页 >  音视频

命运之手

暂无认证

  • 0浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android音视频开发】【007】使用Camera框架预览视频,拍摄照片

命运之手 发布时间:2019-11-25 15:37:31 ,浏览量:0

在前面我们已经介绍过,使用Camera2框架和TextureView,来预览视频、拍摄照片

但很多旧项目和代码,使用的还是旧的Camera框架

这里我们介绍下Camera框架用法,这次我们改用SurfaceView

总代码量很少,不到100行,其中有些是封装好的工具类,但视频部分代码都是原生代码,并不影响


	@SuppressWarnings("all")
	public class LoginActivity extends CommonActivity {
	
	    @BindView(R.id.v_surface_view)
	    SurfaceView surfaceView;
	
	    @BindView(R.id.bt1)
	    View bt1;
	    @BindView(R.id.bt2)
	    View bt2;
	
	    Camera camera;
	
	    Data timer = Data.create(Times.millisOfNow());
	
	    protected void create() {
	        setContentView(R.layout.activity_main);
	        ButterKnife.bind(this, ctx);
	        requestAllPermissionWithCallback();
	    }
	
	    @Override
	    protected void onPermissionOk() {
	
	        //SurfaceView创建完毕时,打开摄像头
	        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
	            @Override
	            public void surfaceCreated(SurfaceHolder holder) {
	                openCamera();
	            }
	
	            @Override
	            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
	            }
	
	            @Override
	            public void surfaceDestroyed(SurfaceHolder holder) {
	            }
	        });
	
	        //拍照
	        bt1.setOnClickListener(v -> {
	            takePhoto();
	        });
	    }
	
	    @SneakyThrows
	    private void openCamera() {
	        camera = Cameras.openBackCamera();
	        Camera.Parameters parameters = camera.getParameters();
	        parameters.setPreviewSize(640, 480);
	        parameters.setPictureSize(640, 480);
	        parameters.setPreviewFrameRate(30);
	        parameters.setPreviewFormat(PixelFormat.YCbCr_420_SP);
	        parameters.setPictureFormat(PixelFormat.JPEG);
	        camera.setParameters(parameters);
	        camera.setPreviewDisplay(surfaceView.getHolder());
	        camera.setPreviewCallback((data, camera) -> {
	            System.out.println("Frame Got");
	        });
	        camera.startPreview();
	    }
	
	    @SneakyThrows
	    private void takePhoto() {
	        Tasks.executeWithIntervalLimit(() -> {
	            camera.autoFocus((success, cam1) -> {
	                camera.takePicture(null, null, (data, cam2) -> {
	                    String path = Files.getAndroidExternalPath("cam.jpg", false);
	                    Files.writeToFile(path, data);
	                    TipBox.tip("照片已保存");
	                    camera.startPreview();
	                });
	            });
	        }, timer, 3000, () -> {
	            TipBox.tip("拍摄频率太快");
	        });
	    }
	}

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0426s