【问题标题】:How to convert between android camera timestamp and system time?如何在android相机时间戳和系统时间之间转换?
【发布时间】:2019-10-30 15:07:37
【问题描述】:

在我的带有camera2接口的Android项目中,我使用AImage_getTimestamp()来获取每张图片的时间戳。但是这个时间戳与我使用clock_gettime() 得到的系统时间不同。但我确实需要利用这两个时间来完成一些工作。

我可以理解这两个时间是在不同的架构中,但我可以将它们相互转换吗?或者说,可以获取相机图片时间戳创建时的系统时间吗?

例如,相机时间戳是离散的,如 ts0ts1ts2ts3。在我的代码中,我想在执行某些代码时获得 real-time 时间戳 ts0',这不完全是 ts0 而是ts0 添加了时间边距。我怎样才能得到这个ts0'

【问题讨论】:

  • 不清楚您要达到的目标,但是您查看过 EXIF 数据还是该分辨率不够准确?
  • 谢谢@MorrisonChang,在我的应用程序中,我需要预测算法运行时间,我想将此运行时间添加到真实的相机时间戳中。但这两个时间并不统一。
  • 那么ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE 你得到了什么。参考:developer.android.com/ndk/reference/group/…
  • @MorrisonChang 对不起我的假期延误,我得到了ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME 作为时间来源。

标签: android time timestamp


【解决方案1】:

您的设备支持实时相机时间戳。如前所述,您的相机时间戳与自启动以来经过的实时处于同一坐标系中。在您的ImageReader.OnImageAvailableListener 中,您可以使用以下代码:

long imageReaderTime = SystemClock.elapsedRealtimeNanos();

Image image = reader.acquireLatestImage();
long cameraTime = image.getTimestamp();

两个时间戳都可以比较,'imageReaderTime'(你感兴趣的那个)比'cameraTime'略大,因为onImageAvailable回调需要一小段时间来通知你新的图像。这也带来了轻微的差异。

应该接受 Eddy Talvala 的回答。

【讨论】:

  • 这个相机时间和相机曝光时间有什么关系?是在相机曝光之前还是之后计算?
  • @flankechen 已经有一段时间了。我似乎记得这是曝光窗口的开始。 Eddy Talvala 下面的回答似乎也表明了这一点(参见“MONOTONIC”)。
【解决方案2】:

一般来说,根据TIMESTAMP_SOURCE 的值,相机时间戳要么基于 CLOCK_MONOTONIC 要么基于 CLOCK_BOOTTIME。

当 SOURCE 为 UNKNOWN 时使用MONOTONIC;但无法保证相机时间戳与系统其余部分之间的同步质量;也就是说,实际开始的曝光时间可能会相差好几毫秒。

REALTIME 表示时间戳在 CLOCK_BOOTTIME 时基中(在 Java SDK 中,与 SystemClock#elapsedRealtimeNanos 匹配。REALTIME 时间戳将紧密同步,以便它们可以与惯性传感器数据(陀螺仪等)相结合准确。

我不知道您正在从 clock_gettime 读取哪种时间戳,但最简单的选择是匹配相机的来源。否则,您需要确定您使用的时间与相机使用的时间之间的偏移量。偏移量在单个相机会话期间不会改变,因此您只需在相机开始使用时测量一次即可。

【讨论】:

  • 谢谢eddy,我的时间源正好是ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE,但时间戳还是和clock_gettime(CLOCK_BOOTTIME, ...)得到的时间不一样
  • 对不起,ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME
猜你喜欢
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多