Вы можете сделать легкое замедленное движение, используя AVMutableComposition
. Как упомянул @ hotpaw2, есть несколько способов замедлить звук - например, вы можете уменьшить высоту звука или сохранить его постоянным. Это решение кажется постоянным, и я не вижу способа изменить это. Может быть, это то, что вы хотите. Возможно, нет.
Вы можете использовать AVAssetExportSession
для записи медленного видео в файл, а поскольку AVMutableComposition
является (возможно удивительно) подклассом AVAsset
, вы можете просмотреть результаты, используя AVPlayer
, даже если Вы не экспортировали замедленную версию видео.
let asset = AVURLAsset(url: Bundle.main.url(forResource: "video", withExtension: "mp4")! , options : nil)
let srcVideoTrack = asset.tracks(withMediaType: .video).first!
let srcAudioTrack = asset.tracks(withMediaType: .audio).first!
let sloMoComposition = AVMutableComposition()
let sloMoVideoTrack = sloMoComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!
let sloMoAudioTrack = sloMoComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)!
let assetTimeRange = CMTimeRange(start: .zero, duration: asset.duration)
try! sloMoVideoTrack.insertTimeRange(assetTimeRange, of: srcVideoTrack, at: .zero)
try! sloMoAudioTrack.insertTimeRange(assetTimeRange, of: srcAudioTrack, at: .zero)
let newDuration = CMTimeMultiplyByFloat64(assetTimeRange.duration, multiplier: 2)
sloMoVideoTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)
sloMoAudioTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)
// Export to a file using AVAssetExportSession
let exportSession = AVAssetExportSession(asset: sloMoComposition, presetName: AVAssetExportPresetPassthrough)!
exportSession.outputFileType = .mp4
exportSession.outputURL = getDocumentsDirectory().appendingPathComponent("slow-mo-\(Date.timeIntervalSinceReferenceDate).mp4")
exportSession.exportAsynchronously {
assert(exportSession.status == .completed)
print("File in \(exportSession.outputURL!)")
}