2017-06-26 7 views
2

ローカルファイルの配列を持っています。後でローカル再生するために保存する必要があるため、.m3u8プレイリストからダウンロードしました。 すべてのファイルは.ts形式であり、それらをすべて1つのビデオファイルにマージします。私はすでにAVMutableCompositionを使ってファイルをマージしようとしましたが、すべてのローカルファイルをAVAssetに変換しようとしましたが、.tracksは常に0を返すので、AVAssetが間違っていると推測して、すべてのファイルの名前をMPEG同じ。Swift merge .tsまたはmpegファイル

は誰もが、正しくそれらのファイルを読み取る方法上の任意のアイデアを持っています、ここに私のコードは、これまでのところです:

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") 
     } 
    } 

答えて

2

あなたはまた.mp4.tv拡張子の名前を変更、.tsファイルではありません動作することはできません十分である

.tvファイルをmp4に翻訳する必要があります。このライブラリをhttps://github.com/Keemotion/TS2MP4に使用することができます

その後、ビデオを混在させることができます

関連する問題