iOS 中摄像头帧数据的时间戳和系统时间戳到关系是怎么样的?

2018-05-10 21:18:25 +08:00
 jasonlz
CMTime time = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
Float64 timestamp = CMTimeGetSeconds(time);

这样得到的时间戳是以何时为起始点的,如何和系统时间( timeIntervalSince1970 )对齐?
7061 次点击
所在节点    iDev
3 条回复
Jameson1559
2018-05-11 11:14:40 +08:00
CMTime 并不等于时间戳,也不能和 NSDate 对等
CMTime 的 0 点 等同于 CMTimeZero 等同于 媒体的 0 时间,是相对于媒体存在的一个计时单位
CMTimeGetSeconds 是获取了用 秒 当作单位的 CMTime 的值
也就是用 CMTime.value / CMTime.timescale

关于和系统时间对齐这个,并不能理解到这个问题要问什么,如果是指:

1) 计算当前 CMTime 与 timeIntervalSince1970 之间的差值
不能这样计算,因为 CMTime 是相对时间,不是系统时间,两者不能进行比对 /运算

2) 让当前 CMTime 等于 timeIntervalSince1970
按理说不应该有这种需求,顶多说修改 CMTime 的值,但是这样做你的帧数据就乱了呀。。



- - - -
关于 CMTime 是什么,在 Apple 提供的文档中有更加详细的说明

-> https://developer.apple.com/documentation/coremedia/cmtime-u58
jasonlz
2018-05-11 16:58:38 +08:00
@Jameson1559 现在就是要做个时间同步,让这个摄像头的时间和别的地方的数据同步,所以就不知道这个 CMTime 的 0 时刻是什么时候,我用首帧时间做了个差,然后发现有几十毫秒的误差,对于算法而言,这个误差有点致命。老哥知道这个 CMTime 的 0 时刻的系统时间怎么获取吗?
Jameson1559
2018-05-12 23:45:59 +08:00
@jasonlz
- - - -
CMTime 的 0 时间永远是相对于媒体而言的呀……但是如果硬要同步的话,我记得 AVDeviceInputDelegate 还是哪个来着,有一个方法叫 - deviceInput: didOutputSampleBuffer 的,在第一次调用采样输出的时候获得一次系统时间,然后把这个当作 0 时间来同步

不过这里还是要注意一个问题,- deviceInput: didOutputSampleBuffer 回调的时候,根据你的采样渠道,可能会返回不止一种类型的 sample,这个不管,只需要首次回调的时间

但是这样可能还是会有一些误差吧- -大概?

或者你现在已经用了我说的这种方法…… ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/453898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX