我正在尝试将视频的速度更改为我选择的持续时间。
所以,我知道我想要的最终持续时间是多少,我只是制作一个叉积以按照我想要的方式使用此功能。
问题是,假设我尝试从 8 分钟缩短到 6 分钟。一切都很好,最终视频时长6分钟,没有错误。
但是,如果我尝试太短的视频,比如 1 或 2 分钟(或更短),那么结果会很糟糕。例如,我尝试获取 13 秒的视频。从第一个角度来看,看起来一切正常,我有 13 秒的视频,但是,当我们点击它时,我们看到它不是一个 13 秒的视频,而是一个 1 分钟 14 秒的视频!
我每次都很短的时间都会得到这个,我尝试了8分钟、18分钟和58分钟的视频,但结果总是一样的。
1分钟总是给出5分51秒的视频
2 分钟总是给出 11 分 54 秒的视频
等等等等..
我还删除了所有音频部分,这样就不会引起任何更多问题,但效果并没有更好。
private func speedUpVideo(url: URL, desiredDuration: Double, completion: @escaping (_ url: URL) -> Void) {
do {
let asset = AVAsset(url: url)
guard let videoTrack = asset.tracks(withMediaType: .video).first else { return }
let currentDuration = asset.duration.seconds
let speedMultiplier = desiredDuration / currentDuration
print(speedMultiplier);
let speedComposition = AVMutableComposition()
let speedVideoTrack = speedComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
speedVideoTrack?.preferredTransform = videoTrack.preferredTransform
let assetTimeRange = CMTimeRange(start: .zero, duration: asset.duration)
try speedVideoTrack?.insertTimeRange(assetTimeRange, of: videoTrack, at: .zero)
let newDuration = CMTimeMultiplyByFloat64(assetTimeRange.duration, multiplier: speedMultiplier)
speedVideoTrack?.scaleTimeRange(assetTimeRange, toDuration: newDuration)
let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long
let date = dateFormatter.string(from: NSDate() as Date)
let savePath = (documentDirectory as NSString).appendingPathComponent("storySocial-\(date).mp4")
let url = NSURL(fileURLWithPath: savePath)
guard let exporter = AVAssetExportSession(asset: speedComposition, presetName: AVAssetExportPreset1920x1080) else { return }
exporter.outputURL = url as URL
exporter.outputFileType = .mp4
exporter.shouldOptimizeForNetworkUse = true
exporter.exportAsynchronously {
switch exporter.status {
case .completed:
guard let url = exporter.outputURL else {
print("No Output URL")
return
}
completion(url)
case .failed, .cancelled:
print("Export failed: \(exporter.error?.localizedDescription ?? "unknown error")")
default:
print("Export \(exporter.status.rawValue)")
}
}
} catch {
print("ERRRRROOORRRR")
}
}
顺便说一句,这个功能来自这个问题:如何更改视频的速度? 并得到@Trevor
的回答