给定已从资产中读取的CMSampleBuffers列表,我希望调整资产的持续时间,使其长度为原来的一半(速度的两倍)。
目前,我生成新时间戳的功能如下所示:
func adjustTimeStampsForBuffers(buffers: [CMSampleBuffer]) -> [CMTime] {
let frameCount = buffers.count
// self.duration is CMTimeGetSeconds(asset.duration)
let increment = Float(self.duration / 2) / Float(frameCount)
return Array(0.stride(to: frameCount, by: 1)).enumerate().map {
let seconds: Float64 = Float64(increment) * Float64($0.index)
return CMTimeMakeWithSeconds(seconds, self.asset.duration.timescale)
}
}然而,这似乎不起作用,而且输出的资产实际上是长度的两倍,而不是一半。有人能指出我哪里出错了吗?
编辑:
感谢@sschale,这是我的最后答案:
func adjustTimeStampsForBuffers(buffers: [CMSampleBuffer]) -> [CMTime] {
return buffers.map {
let time = CMSampleBufferGetPresentationTimeStamp($0)
return CMTimeMake(time.value, time.timescale * 2)
}
}不是计算新值,而是调整时间戳。
发布于 2016-05-30 05:56:13
根据我对文档的阅读,这里的关键似乎是self.asset.duration.timescale,因为更改它会影响整个文件(如果我理解您所引用的是整个文件的时间刻度,或者您需要在每个缓冲区中调整它)。
更多信息也请参见这里。
相关章节:
CMTime表示为有理数,有分子( int64_t值)和分母( int32_t时间刻度)。从概念上讲,时间刻度指定分子中每个单位占用的秒的分数。因此,如果时间刻度为4,每个单位代表四分之一秒;如果时间刻度为10,则每个单位代表十分之一秒,依此类推。除了一个简单的时间值,CMTime还可以表示非数字值:+无穷大、-infinity和不定值。使用标志CMTime指示是否在某个点舍入时间。 CMTimes包含一个划时代数,通常设置为0,但可用于区分不相关的时间线:例如,它可以通过表示循环每次递增,以区分循环0中的时间N和循环1中的时间N。
https://stackoverflow.com/questions/37518249
复制相似问题