试图了解CMTime
Posted
技术标签:
【中文标题】试图了解CMTime【英文标题】:Trying to understand CMTime 【发布时间】:2012-10-15 19:11:11 【问题描述】:我看过一些examplesofCMTime(三个单独的链接),但我还是不明白。我正在使用带有 AVCaptureVideoDataOutput 的 AVCaptureSession,我想设置输出的最大和最小帧速率。我的问题是我只是不了解 CMTime 结构。
显然 CMTimeMake(value, timeScale) 应该每 1/timeScale 秒给我一个值帧,总共 value/timeScale 秒,还是我弄错了?
为什么没有记录在任何地方以解释它的作用?
如果它真的像那样工作,我如何让它有无限数量的帧?
如果它真的很简单,我很抱歉,但还没有点击任何东西。
【问题讨论】:
Trying to understand CMTime and CMTimeMake 的可能副本 warrenmoore.net/understanding-cmtime 【参考方案1】:CMTime
结构表示存储为有理数的时间长度(请参阅CMTime Reference)。 CMTime
有一个value
和一个timescale
字段,代表时间value/timescale seconds
。
CMTimeMake
是一个返回CMTime
结构的函数,例如:
CMTime t1 = CMTimeMake(1, 10); // 1/10 second = 0.1 second
CMTime t2 = CMTimeMake(2, 1); // 2 seconds
CMTime t3 = CMTimeMake(3, 4); // 3/4 second = 0.75 second
CMTime t4 = CMTimeMake(6, 8); // 6/8 second = 0.75 second
最后两个时间值t3
和t4
代表相同的时间值,因此
CMTimeCompare(t3, t4) == 0
如果您设置了AVCaptureSession
的videoMinFrameDuration
,则设置并没有什么不同
connection.videoMinFrameDuration = CMTimeMake(1, 20); // or
connection.videoMinFrameDuration = CMTimeMake(2, 40);
在这两种情况下,帧之间的最小时间间隔都设置为 1/20 = 0.05 秒。
【讨论】:
如何将 3 秒转换为 CMTime? @PradeepReddyKypa:CMTimeMake(3, 1)
很好解释... :-)
请帮帮我:我在播放时有视频的current time
,那如何获得number of frame
?
@MartinR 使用addPeriodicTimeObserver
是否可以达到预期的效果?非常感谢***.com/questions/53704885【参考方案2】:
我的经历不同。
对于let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)
如果您设置断点并查看调试器侧窗口,它会显示:
“383 百分之一秒”
通过在 AVPlayer 中寻找视频中的固定偏移量进行测试已证实了这一点。
所以将实际的秒数放在 seconds 字段中,并将精度放在 preferredTimescale 字段中。所以 100 意味着百分之一秒的精度。
在做
let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)
仍然在视频中寻找相同的位置,但它在调试器侧窗口中显示为“3833 1000ths of a second”
在做
let testTime = CMTime(seconds: 3.83, preferredTimescale: 1)
不寻找视频中的相同位置,因为它已被截断,并在调试器侧窗口中显示为“3 秒”。请注意,由于首选时间刻度,.833 部分已丢失。
【讨论】:
【参考方案3】:CMTime(seconds: value, timescale: scale)
在一秒钟内表示价值/规模
【讨论】:
以上是关于试图了解CMTime的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NSTimeInterval 进行 CMTime 引用