我正在尝试将视频的速度更改为我选择的持续时间。
所以我知道我想要的最终持续时间是多少,我只是做一个叉积,以我想要的方式使用这个函数。
事情是,如果我尝试去从8分钟到6分钟让我们说.一切都很好,最后的视频持续6分钟,没有错误.
但是,如果我尝试太短的视频,像1或2分钟(或更少),然后,结果是相当糟糕.在这里,例如,我试图得到一个13秒的视频.从第一个Angular 来看,看起来一切工作在我有我的13秒的视频,但是,当我们点击它,我们看到它不是一个13秒的视频,而是一个1分14秒的!
100d 1xx 1c 1d 1x的字符串
我得到了这个每一个短的时间,我尝试了8分钟,18分钟,和58分钟的视频,但结果总是一样的。
1分钟总是给给予5分51秒的视频
2分钟总是给给予11 m54 s视频
等等等等。
我还删除了所有的音频部分,使不会造成任何更多的问题,但它没有更好地工作。
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")
}
}
字符串
顺便说一下,这个函数来自这个SO问题:How can I change the speed of a video?,并由@特雷弗回答
1条答案
按热度按时间li9yvcax1#
这个功能看起来还可以,我想
AVAssetExportSession
可能有一个最小的持续时间,特别是在处理非常高的速度乘数时。如果速度变化太极端,导出会话可能无法按预期处理视频。