Android13 Camera New Feature--Timestamp base support

2022-09-21 14:55:45 浏览数 (1)

从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~~

0 人点赞