从Android13开始,Android支持为每个摄像头的output stream设置时间戳基数,本文介绍了如何使用它
OutputConfiguration为设置时间戳基数提供API支持
Android13在OutputConfiguration类中添加了以下常量,以表示不同的时间戳基数
常量 | 值 | 描述 |
---|---|---|
TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED | 4 | 时间戳与choreographer同步 |
TIMESTAMP_BASE_DEFAULT | 0 | 默认时间基 |
TIMESTAMP_BASE_MONOTONIC | 2 | 时间基大致与SystemClock.uptimeMillis()相同 |
TIMESTAMP_BASE_REALTIME | 3 | 时间基大致与SystemClock.elapsedRealtime()相同 |
TIMESTAMP_BASE_SENSOR | 1 | CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE |
TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED
输出图像的时间戳被来自显示子系统的choreographer脉冲覆盖,以更平滑的显示相机帧
- 默认情况下,SurfaceView的输出目标采用该时间基
- SurfaceTexture不适用此时间基,因为它的updateTexImage()方法总是使用相机流的最新图像。而对于TextureView,图像会立即显示
- 具有此时基的时间戳不能匹配
- CaptureResult的sensor timestamp
- CameraCaptureSession.CaptureCallback#onCaptureStarted()回调携带的timestamp
- 如果时间戳是用于音频视频同步,那么不应该采用此时间基
TIMESTAMP_BASE_DEFAULT
相机设备基于Surface的特性来决定具体使用哪种时间基
- 对于SurfaceView的输出surface,时间基是TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED
- 带HardwareBuffer.USAGE_VIDEO_ENCODE usge的Surface,比如MediaRecorder,MediaCodec或ImageReader的Surface,时间基是TIMESTAMP_BASE_MONOTONIC
- TIMESTAMP_BASE_SENSOR则是其它情况时间基
TIMESTAMP_BASE_MONOTONIC
输出图像的时间戳是单调递增的,与SystemClock.uptimeMillis()大致处于相同的时基,具有此时基的时间戳可直接用于视频录制中的音频-视频同步
CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE是REALTIME时,则具有此时基的时间戳是不能和CaptureResult的sensor timestamp、CameraCaptureSession.CaptureCallback#onCaptureStarted携带的timestamp进行匹配的
TIMESTAMP_BASE_REALTIME
输出图像的时间戳与SystemClock.elapsedRealtime()大致处于相同的时基,具有此时基的时间戳不能直接用于视频录制中的音频-视频同步
CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE是UNKNOWN时,则具有此时基的时间戳是不能和CaptureResult的sensor timestamp、CameraCaptureSession.CaptureCallback#onCaptureStarted携带的timestamp进行匹配的
如果在仅支持TIMESTAMP_SOURCE_UNKNOWN的设备上使用此时间基,时间戳的准确性是无法保证的。因为不能保证足够精确,所以不能用于将图像数据与惯性传感器的输出进行融合,以实现图像稳定或增强现实等功能
TIMESTAMP_BASE_SENSOR
输出图像的时间戳位于CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE指定的时基中。应用程序可以使用该时间戳查找特定输出图像的相应结果元数据
接口
Android 13在OutputConfiguration类中添加了两个API来设置和获取当前OutputConfiguration的时间戳基
set接口
代码语言:javascript复制/**
* 设置timestamp base
* 时间基描述与CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE有关
* 如果该方法未调用,默认为TIMESTAMP_BASE_DEFAULT
**/
public void setTimestampBase (int timestampBase)
get接口
代码语言:javascript复制/**
* 获取当前时间基
* 如果setTimestampBase(int)未调用,则返回TIMESTAMP_BASE_DEFAULT
**/
public int getTimestampBase ()
示例
TIMESTAMP_BASE_DEFAULT
当我们给预览的OutputConfiguration的时间基设置为TIMESTAMP_BASE_DEFAULT时,从SurfaceTexture获取的时间戳能匹配从Camera的onCaptureStarted携带的时间戳
TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED
当我们给预览的OutputConfiguration的时间基设置为TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED时,从SurfaceTexture获取的时间戳不能匹配从Camera的onCaptureStarted携带的时间戳
英文原文:
https://android-camera.com/android-camera-api/android13-camera-new-feature/camera-timestamp-base-support.html
~~END~~