Android 自定义前置摄像头相机 安卓前置拍照怎么放大

您所在的位置:网站首页 华为mate30刘海隐藏后效果图 Android 自定义前置摄像头相机 安卓前置拍照怎么放大

Android 自定义前置摄像头相机 安卓前置拍照怎么放大

2024-07-16 04:18| 来源: 网络整理| 查看: 265

Android 自定义前置摄像头相机 安卓前置拍照怎么放大 转载

mob64ca141275de 2023-09-25 07:10:48

文章标签 Android 自定义前置摄像头相机 ide ci Source 文章分类 Android 移动开发

安卓使用系统相机拍照录视频

调用系统相机拍照和录制视频代码和踩的坑的总结。

文章目录安卓使用系统相机拍照录视频前言1、问题记录2、工具类代码

前言

使用surfaceView+MediaRecorder进行视频拍摄和问题记录

1、问题记录

问题记录1:无法手指缩小放大问题:修改如下首先重新 onTouchEvent ,记录俩点之间距离和缩放比列,然后重新设置camera中Parameters里的zoom。

private float startDis; private boolean isTouch; /** * 记录是拖拉照片模式还是放大缩小照片模式 */ private static final int MODE_INIT = 0; /** * 放大缩小照片模式 */ private static final int MODE_ZOOM = 1; private int mode = MODE_INIT;// 初始状态 private Point point; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mode = MODE_INIT; break; case MotionEvent.ACTION_POINTER_DOWN: if (event.getPointerCount() < 2) return super.onTouchEvent(event); mode = MODE_ZOOM; startDis = spacing(event);//两点的距离 break; case MotionEvent.ACTION_MOVE: if (mode == MODE_ZOOM) { if (event.getPointerCount() < 2) return super.onTouchEvent(event); float endDis = spacing(event);//两点的距离 int scale = (int) ((endDis - startDis) / 10f); if (scale >= 1 || scale parameters.getMaxZoom()) zoom = parameters.getMaxZoom(); parameters.setZoom(zoom); camera.setParameters(parameters);

2:部分手机拍摄导致崩溃 start failed:或拍摄后空文件问题原因:1,MediaRecorder参数设置错误,有的手机不支持。2,参数配置顺序出错。

//按以下顺序,亲测,都可以正常拍摄视频 camera.unlock(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncodingBitRate(10*1024 * 1024); CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); if (null!=mProfile){ mediaRecorder.setVideoEncoder(mProfile.videoCodec); mediaRecorder.setVideoFrameRate(mProfile.videoFrameRate); Log.d("分辨率",mProfile.videoFrameWidth+"::"+ mProfile.videoFrameHeight); //设置录像的分辨率 mediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight); mediaRecorder.setAudioEncodingBitRate((int) (mProfile.videoBitRate * 0.7)); } File file = new File(path); if (!file.exists()) { file.mkdirs(); } mediaRecorder.setOutputFile(name); Log.d("录制视频地址",name); // 发送广播,通知刷新图库的显示 ContextFactory.getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + name))); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); mediaRecorder.prepare(); mediaRecorder.start();

3:拍摄后导致旋转

/***不设置时,录制的视频总是倒着,翻屏导致视频上下翻滚*/ Log.d("摄像头",backOrFtont+"::"+isBack); if (backOrFtont == Camera.CameraInfo.CAMERA_FACING_BACK){ mediaRecorder.setOrientationHint(90); }else if (backOrFtont==Camera.CameraInfo.CAMERA_FACING_FRONT){ mediaRecorder.setOrientationHint(270); }2、工具类代码

代码如下(示例):

public class CameraUtils { private MediaRecorder mediaRecorder; private Camera camera; /*** 标识当前是前摄像头还是后摄像头 back:0 front:1*/ private int backOrFtont = 0; private SurfaceHolder.Callback callback; private Context context; private SurfaceView surfaceView; /***录制视频的videoSize*/ private int height, width; /***photo的height ,width*/ private int heightPhoto, widthPhoto; public void create(SurfaceView surfaceView, Context context) { this.context = context; this.surfaceView = surfaceView; surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.setKeepScreenOn(true); callback = new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); getVideoSize();//获取拍摄尺寸 mediaRecorder = new MediaRecorder(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { doChange(holder);//切换摄像头 focus();//聚焦 } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { camera.release(); camera = null; } } }; surfaceView.getHolder().addCallback(callback); } private void doChange(SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } //缩放 public void setCameraZoom(int scale) { Camera.Parameters parameters = camera.getParameters(); int zoom = parameters.getZoom() + scale; if (zoom < 0) zoom = 0; if (zoom > parameters.getMaxZoom()) zoom = parameters.getMaxZoom(); parameters.setZoom(zoom); camera.setParameters(parameters); } /** * 切换摄像头 */ public void changeCamera() { int cameraCount = 0; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras(); for (int i = 0; i < cameraCount; i++) { Camera.getCameraInfo(i, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && backOrFtont == 0) { camera.stopPreview(); camera.release(); camera = null; camera = Camera.open(i); try { camera.setPreviewDisplay(surfaceView.getHolder()); camera.setDisplayOrientation(90); } catch (IOException e) { e.printStackTrace(); } backOrFtont = 1; camera.startPreview(); break; } else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK && backOrFtont == 1) { camera.stopPreview(); camera.release(); camera = null; camera = Camera.open(i); try { camera.setPreviewDisplay(surfaceView.getHolder()); camera.setDisplayOrientation(90); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); backOrFtont = 0; break; } } } public void stopRecord() { if (mediaRecorder != null) { //设置后不会崩 mediaRecorder.setOnErrorListener(null); mediaRecorder.setPreviewDisplay(null); } mediaRecorder.release(); camera.release(); mediaRecorder = null; camera = Camera.open(); mediaRecorder = new MediaRecorder(); doChange(surfaceView.getHolder()); } public void remuse() { backOrFtont=0; } public void stop() { if (mediaRecorder != null && camera != null) { mediaRecorder.release(); camera.release(); } } public void destroy() { if (mediaRecorder != null && camera != null) { mediaRecorder.release(); camera.release(); mediaRecorder = null; camera = null; } } /** * @param path 保存的路径 * @param name 录像视频名称(不包含后缀) * @param isBack */ public void startRecord(String path, String name, boolean isBack) { try { camera.unlock(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncodingBitRate(10*1024 * 1024); /* if (backOrFtont==0){ mediaRecorder.setVideoSize(640,480); mediaRecorder.setVideoFrameRate(24); }else {*/ CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); if (null!=mProfile){ mediaRecorder.setVideoEncoder(mProfile.videoCodec); mediaRecorder.setVideoFrameRate(mProfile.videoFrameRate); Log.d("分辨率",mProfile.videoFrameWidth+"::"+ mProfile.videoFrameHeight); //设置录像的分辨率 mediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight); mediaRecorder.setAudioEncodingBitRate((int) (mProfile.videoBitRate * 0.7)); }else { // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //mediaRecorder.setVideoFrameRate(30); // mediaRecorder.setVideoSize(WIDTH_DEF, HEIGHT_DEF); // mediaRecorder.setVideoEncodingBitRate((int) (1920000 * 0.7)); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //mediaRecorder.setAudioEncodingBitRate(128000); //mediaRecorder.setAudioChannels(2); //mediaRecorder.setAudioSamplingRate(48000); } File file = new File(path); if (!file.exists()) { file.mkdirs(); } mediaRecorder.setOutputFile(name); Log.d("录制视频地址",name); // 发送广播,通知刷新图库的显示 ContextFactory.getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + name))); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); /***不设置时,录制的视频总是倒着,翻屏导致视频上下翻滚*/ Log.d("摄像头",backOrFtont+"::"+isBack); if (backOrFtont == Camera.CameraInfo.CAMERA_FACING_BACK){ mediaRecorder.setOrientationHint(90); }else if (backOrFtont==Camera.CameraInfo.CAMERA_FACING_FRONT){ mediaRecorder.setOrientationHint(270); } mediaRecorder.prepare(); mediaRecorder.start(); }catch (Exception e){ e.printStackTrace(); ToastUtils.showToast(AppManager.getAppManager().currentActivity(),"拍摄视频出错",false); } } /*** * 获取SupportedVideoSizes 控制输出视频width在300到600之间(尽可能小) * 获取PictureSize的大小(控制在w:1000-2000之间) */ public void getVideoSize() { Camera.Parameters parameters = camera.getParameters(); List videoSize = parameters.getSupportedVideoSizes(); for (int i = 0; i < videoSize.size(); i++) { int width1 = videoSize.get(i).width; int height1 = videoSize.get(i).height; if (width1 >= 600 && width1 = 700 && height1 = 1400 && width1 = 1400 && height1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3