Android Camera2的使用记录

Android Camera2的使用

一、使用前准备

  1. Api 版本控制:API>=21
  2. 权限检查:
    <!--相机权限-->
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>

二、开始使用

摄像头变量
  1. CameraCharacteristics.LENS_FACING_FRONT:前置
  2. CameraCharacteristics.LENS_FACING_BACK:后置
  3. CameraCharacteristics.LENS_FACING_EXTERNAL:额外(双摄像头)

三、功能使用

首先得判断一下设备是否支持camera2功能

传送门
API 21要求实现Camera2 API,虽然厂商实现了这些API,但实际上可设置的参数比Camera少,甚至性能都比Camera差。Camera2留给厂商一条退路,可以指明设备对Camera2的支持程度,结果好多不乏主力设备机型,都是最低支持程度。

通过

CameraCharacteristics characteristics
                        = manager.getCameraCharacteristics(cameraId);
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);

可以得到对Camera2的支持程度,具体描述在INFO_SUPPORTED_HARDWARE_LEVEL中有介绍。得到的int值在CameraMetadata中定义,其中FULL值为1,LEGACY值为2,LIMITED值为0,其支持程度为FULL > LIMITED > LEGACY。

手动对焦:
  1. 先关闭自动焦距模式 mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);

  2. 再设置上焦距值 mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 焦距值)

关于预览画面变形问题(仿微信,全屏拍摄)

这里有几个尺寸需要分清楚
1. surfaceView的尺寸,也就是显示画面的尺寸。
2. 摄像头支持的尺寸
3. surfaveView buffer的尺寸,这个尺寸往往是最容易忽略设置的。我们可以在打开摄像头的回掉里面去设置buffer尺寸的大小。

// We configure the size of default buffer to be the size of camera preview we want.
                texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

以上几个尺寸不一致都会导致变形的问题

使用过程中遇到的问题

录制的方向问题

并不是许多demo里面所说的使用

getWindowManager().getDefaultDisplay().getRotation();

去判断,这个角度只有用户开启自动旋转的时候才有效果。但是像系统相机,还是微信的相机在关闭自动旋转的情况下,录制也会屏幕旋转的,而是靠重力感应去判断屏幕的旋转方向。最明显的效果是微信的相机icon会根据旋转的角度改变。

四、参考引用

[1]: 极客学院android.hardware.camera2 使用指南
[2]: Android平台Camera开发实践指南
[3]: Android 拍摄(横\竖屏)

Android Camera2 API 提供了高级的摄像头控制功能,其中包括支持实时音视频流传输到RTMP服务器的能力。Rtmp(Real-Time Messaging Protocol)是一种广泛用于在线直播的应用层协议。要在Camera2中实现实时音视频流到RTMP服务器,你需要做以下几个步骤: 1. **设置MediaRecorder**: 使用`Camera2VideoCaptureSession`和`SurfaceTexture`来捕获视频帧,并通过`MediaRecorder`对象记录视频流。记得指定`setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)`和`setAudioEncoder(MediaRecorder.AudioEncoder.AAC)`等编码格式。 ```java MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR_NB); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // or use AAC if supported by the encoder ``` 2. **开启RTMP流**:创建一个RtmpStreamingService或者使用第三方库(如Wowza SDK、FMLE等),配置URL和连接参数,开始将录制的视频数据发送到RTMP服务器。 3. **处理音频和视频同步**:确保从Camera获取的每帧视频都与对应的音频帧同步,这通常需要在MediaRecorder的回调函数里完成。 4. **线程管理**:由于RTMP传输是异步操作,可能涉及到多个线程,比如主线程用于UI交互,其他线程用于媒体捕获和上传。注意处理好线程间的同步和通信。 5. **异常处理**:处理可能出现的网络中断、设备权限等问题,并提供适当的错误反馈给用户。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值