2017-06-26 1 views
2

Ich habe eine Reihe von lokalen Dateien, ich habe sie von einer .m3u8 Playlist heruntergeladen, da ich für spätere lokale Wiedergabe speichern muss. Alle Dateien sind im .ts-Format und ich möchte sie alle in einer einzigen Videodatei zusammenführen. Ich habe bereits versucht, die Dateien unter Verwendung AVMutableComposition zu verschmelzen, versuchte ich, alle lokalen Dateien in eine AVAsset zu konvertieren, aber die Eigenschaft .tracks immer 0 zurückgeben, so nehme ich an, dass AVAsset falsch war, dann habe ich versucht, alle Dateien in MPEG umzubenennen, aber das Problem noch das Gleiche.Swift merge .ts oder mpeg files

Hat jemand eine Idee, wie man, richtig gelesen, diese Dateien, hier ist mein Code so weit:

func mergeAllVideos(filesPath: URL) { 
     let allVideos = extractAllFile(atPath: filesPath.absoluteString) 
     var arrayVideos = [AVURLAsset]() 
     var atTimeM: CMTime = CMTimeMake(0, 0) 
     var lastAsset: AVAsset! 
     var layerInstructionsArray = [AVVideoCompositionLayerInstruction]() 
     var completeTrackDuration: CMTime = CMTimeMake(0, 1) 
     var videoSize: CGSize = CGSize(width: 0.0, height: 0.0) 
     var totalTime : CMTime = CMTimeMake(0, 0) 

     for asset in allVideos.enumerated() { 
      if let url = URL(string: asset.element) { 

       let newAsset = AVURLAsset(url: url) 
       arrayVideos.append(newAsset) 
      } 
     } 

     let mixComposition = AVMutableComposition() 
     for videoAsset in arrayVideos { 
      let player = AVPlayer(url: videoAsset.url) 

      let videoTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 
      do { 
       if videoAsset == arrayVideos.first{ 
        atTimeM = kCMTimeZero 
       } else{ 
        atTimeM = totalTime 
       } 
       print(videoAsset.tracks) 
       try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0], at: atTimeM) 
       videoSize = videoTrack.naturalSize 
      } catch let error as NSError { 
       print("error: \(error)") 
      } 

      totalTime = CMTimeAdd(totalTime, videoAsset.duration) 

      completeTrackDuration = CMTimeAdd(completeTrackDuration, videoAsset.duration) 
      let videoInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 
      if let asset = arrayVideos.last, videoAsset != asset { 
       videoInstruction.setOpacity(0.0, at: completeTrackDuration) 
      } 
      layerInstructionsArray.append(videoInstruction) 
      lastAsset = videoAsset 
     } 

     let mainInstruction = AVMutableVideoCompositionInstruction() 
     mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, completeTrackDuration) 
     mainInstruction.layerInstructions = layerInstructionsArray 

     let mainComposition = AVMutableVideoComposition() 
     mainComposition.instructions = [mainInstruction] 
     mainComposition.frameDuration = CMTimeMake(1, 30) 
     mainComposition.renderSize = CGSize(width: videoSize.width, height: videoSize.height) 

     let documentDirectory = NSSearchPathForDirectoriesInDomains(.developerApplicationDirectory, .userDomainMask, true)[0] 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .long 
     dateFormatter.timeStyle = .short 
     let date = dateFormatter.string(from: NSDate() as Date) 
     let savePath = (documentDirectory as NSString).appendingPathComponent("mergeVideo-\(date).mov") 
     let url = NSURL(fileURLWithPath: savePath) 

     let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) 
     exporter!.outputURL = url as URL 
     exporter!.outputFileType = AVFileTypeQuickTimeMovie 
     exporter!.shouldOptimizeForNetworkUse = true 
     exporter!.videoComposition = mainComposition 
     exporter!.exportAsynchronously { 
      print("exported") 
     } 
    } 

Antwort

2

Sie können nicht mit .ts Dateien arbeiten, auch von .tv Erweiterung .mp4 Umbenennung nicht genug sein

Sie müssen .tv Datei zu mp4 übersetzen. Sie können diese Lib https://github.com/Keemotion/TS2MP4 für diese

verwenden und dann können Sie Videos

mischen