首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAsset视频调整持续时间

AVAsset视频调整持续时间
EN

Stack Overflow用户
提问于 2016-05-30 05:35:38
回答 1查看 1.5K关注 0票数 0

给定已从资产中读取的CMSampleBuffers列表,我希望调整资产的持续时间,使其长度为原来的一半(速度的两倍)。

目前,我生成新时间戳的功能如下所示:

代码语言:javascript
复制
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,这是我的最后答案:

代码语言:javascript
复制
func adjustTimeStampsForBuffers(buffers: [CMSampleBuffer]) -> [CMTime] {
    return buffers.map {
        let time = CMSampleBufferGetPresentationTimeStamp($0)
        return CMTimeMake(time.value, time.timescale * 2)
    }
}

不是计算新值,而是调整时间戳。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37518249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档