swift 改变视频速度

xnifntxz  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(106)

我正在尝试将视频的速度更改为我选择的持续时间。
所以我知道我想要的最终持续时间是多少,我只是做一个叉积,以我想要的方式使用这个函数。
事情是,如果我尝试去从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?,并由@特雷弗回答

li9yvcax

li9yvcax1#

这个功能看起来还可以,我想AVAssetExportSession可能有一个最小的持续时间,特别是在处理非常高的速度乘数时。如果速度变化太极端,导出会话可能无法按预期处理视频。

相关问题