How to do Slow Motion video in IOS

前端 未结 6 1345
小蘑菇
小蘑菇 2020-11-28 21:14

I have to do \"slow motion\" in a video file along with audio, in-between some frames and need to store the ramped video as a new video.

6条回答
  •  伪装坚强ぢ
    2020-11-28 21:50

    An example in swift :

    I

    var asset: AVAsset?  
    func configureAssets(){
    
        let videoAsset = AVURLAsset(url: Bundle.main.url(forResource: "sample", withExtension: "m4v")!)
        let audioAsset = AVURLAsset(url: Bundle.main.url(forResource: "sample", withExtension: "m4a")!)
        //    let audioAsset2 = AVURLAsset(url: Bundle.main.url(forResource: "audio2", withExtension: "m4a")!)
    
        let comp = AVMutableComposition()
    
        let videoAssetSourceTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo).first! as AVAssetTrack
        let audioAssetSourceTrack = videoAsset.tracks(withMediaType: AVMediaTypeAudio).first! as AVAssetTrack
        //    let audioAssetSourceTrack2 = audioAsset2.tracks(withMediaType: AVMediaTypeAudio).first! as AVAssetTrack
    
        let videoCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
        let audioCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
    
        do {
    
            try videoCompositionTrack.insertTimeRange(
                CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(9 , 600)),
                of: videoAssetSourceTrack,
                at: kCMTimeZero)
    
    
    
            try audioCompositionTrack.insertTimeRange(
                CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(9, 600)),
                of: audioAssetSourceTrack,
                at: kCMTimeZero)
    
            //
            //      try audioCompositionTrack.insertTimeRange(
            //        CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(3, 600)),
            //        of: audioAssetSourceTrack2,
            //        at: CMTimeMakeWithSeconds(7, 600))
    
            let videoScaleFactor = Int64(2.0)
            let videoDuration: CMTime = videoAsset.duration
    
    
            videoCompositionTrack.scaleTimeRange(CMTimeRangeMake(kCMTimeZero, videoDuration), toDuration: CMTimeMake(videoDuration.value * videoScaleFactor, videoDuration.timescale))
            audioCompositionTrack.scaleTimeRange(CMTimeRangeMake(kCMTimeZero, videoDuration), toDuration: CMTimeMake(videoDuration.value * videoScaleFactor, videoDuration.timescale))
            videoCompositionTrack.preferredTransform = videoAssetSourceTrack.preferredTransform
    
    
    
        }catch { print(error) }
    
        asset = comp
    }
    

    II

      func createFileFromAsset(_ asset: AVAsset){
    
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
    
    let filePath = documentsDirectory.appendingPathComponent("rendered-audio.m4v")
    deleteFile(filePath)
    
    if let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetLowQuality){
    
    
      exportSession.canPerformMultiplePassesOverSourceMediaData = true
      exportSession.outputURL = filePath
      exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration)
      exportSession.outputFileType = AVFileTypeQuickTimeMovie
      exportSession.exportAsynchronously {
        _ in
        print("finished: \(filePath) :  \(exportSession.status.rawValue) ")
      }
    }
    
     }
    
     func deleteFile(_ filePath:URL) {
    guard FileManager.default.fileExists(atPath: filePath.path) else {
      return
    }
    
    do {
      try FileManager.default.removeItem(atPath: filePath.path)
    }catch{
      fatalError("Unable to delete file: \(error) : \(#function).")
    }
    }
    

提交回复
热议问题