更改视频速度

问题描述 投票:0回答:1

我正在尝试将视频的速度更改为我选择的持续时间。

所以,我知道我想要的最终持续时间是多少,我只是制作一个叉积以按照我想要的方式使用此功能。

问题是,假设我尝试从 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

的回答
swift video avfoundation
1个回答
0
投票

这可能对你有帮助。如果不行的话我再仔细看看。 https://fredriccliver.medium.com/how-to-change-the-play-speed-rate-on-avplayer-swift-284a56ba2797

© www.soinside.com 2019 - 2024. All rights reserved.