我正在创建我的这个应用程序,并以120和240 fps的速度拍摄视频。

当我在Mac上观看这些视频时,我会在时间轴下方看到这些标记。

ios - 制作真正慢动作的慢动作视频-LMLPHP

这些标记是可编辑的,代表慢动作的区域。因此,视频以正常帧速率开始,以慢动作进入,最后返回到正常帧速率。我没有把那些标记放在那里,iOS放了。在那种情况下,我想知道是否有一种方法可以删除它们并使视频完全慢动作。

我只是像视频非慢动作一样正常初始化AVAssetWriter

另外,我注意到这些“慢动作”视频并不是真正的慢动作,但它们是慢动作的“配方”,只能在使用QuickTime X的iOS设备和Mac上正确播放。即使是QuickTime 7,也无法正确播放。

无论如何,要使此东西成为可以在任何播放器,任何计算机上播放的真正的慢动作?

最佳答案

您的“慢动作”视频文件实际上只是高帧率的视频文件。 iOS正在降低播放速率,以慢动作的形式炫耀多余的帧。问题是其他播放器以1的播放速率播放,因此要使该效果可移植,您需要修改帧表示时间戳。

您可能可以使用AVMutableComposition做到这一点,但我更喜欢使用更多所见即所得的AVAssetReader/AVAssetWriter对。对于输入文件中的每一帧,都是这样的:

if let inSampleBuffer = readerOutput.copyNextSampleBuffer() {
    let inTimeStamp = CMSampleBufferGetPresentationTimeStamp(inSampleBuffer)
    let outTimeStamp = CMTimeMultiplyByFloat64(inTimeStamp, 240.0/30)  // slow 240 fps down to 30fps (8x slowmo)
    var outSampleBuffer: CMSampleBuffer?
    var outTimingInfo = CMSampleTimingInfo(duration: kCMTimeInvalid, presentationTimeStamp: outTimeStamp, decodeTimeStamp: kCMTimeInvalid)

    if CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, inSampleBuffer, 1, &outTimingInfo, &outSampleBuffer) == noErr {
        writerInput.appendSampleBuffer(outSampleBuffer!)
    }
} else {
    // finished
}

关于ios - 制作真正慢动作的慢动作视频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43438709/

10-11 11:05