制作一个真正慢动作的慢动作视频

Spa*_*Dog 5 avfoundation ios avassetwriter avassetwriterinput

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

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

在此输入图像描述

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

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

此外,我注意到这些"慢动作"视频并不是真正的慢动作,但它们是慢动作的"配方",只能在使用QuickTime X的iOS设备和Mac上正常播放.甚至QuickTime 7都没有正确播放它们.

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

Rhy*_*man 5

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

您可能可以使用 an 来做到这一点,AVMutableComposition但我更喜欢使用 more wysiwyg 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
}
Run Code Online (Sandbox Code Playgroud)