2016-02-29 67 views
0

我正在使用此短片段來設置我的視頻。由於一些未知的原因 - 有時視頻根本不會顯示,而對於其他視頻,它會很好地工作。AVMutableVideoComposition有時不會播放視頻

let videoTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] 
     let composition: AVMutableComposition = AVMutableComposition() 

     let videoComposition: AVMutableVideoComposition = AVMutableVideoComposition() 
     var videoSize: CGSize = videoTrack.naturalSize 
     let isPortrait_: Bool = self.isVideoPortrait(asset) 
     if isPortrait_ { 
      NSLog("video is portrait ") 
      videoSize = CGSizeMake(videoSize.height, videoSize.width) 
     } 
     composition.naturalSize = videoSize 
     videoComposition.renderSize = videoSize 
     // videoComposition.renderSize = videoTrack.naturalSize; // 
     videoComposition.frameDuration = CMTimeMake(1, 30) 

     let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: 1) 
     let timeRange = videoTrack.timeRange 
     do { 
      try compositionVideoTrack.insertTimeRange(timeRange, ofTrack: videoTrack, atTime: kCMTimeZero) 
     } catch { 
      print("error") 

     } 
     let layerInst = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 

     layerInst.setTransform(videoTrack.preferredTransform, atTime: kCMTimeZero) 
     let inst: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction() 
     inst.timeRange = timeRange 

     inst.layerInstructions = [layerInst] 
     videoComposition.instructions = [inst] 

     let playerItem = AVPlayerItem(asset: composition) 
     playerItem.videoComposition = videoComposition 

對於一些視頻,它只是不會顯示出來。

有什麼建議嗎?謝謝!!

回答

0

你好,我有一個相對類似的代碼,希望這可以幫助你找出你的問題

class func MergeVideosSequentially(URLS : [NSURL], callback : (error : ErrorType? , outURL : NSURL?) -> Void){ 
    let composition = AVMutableComposition() 

    //videoTrack 
    let videoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
    let audioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 

    var cursorTime = kCMTimeZero 
    for URL in URLS {   
     let asset = AVAsset(URL: URL) 
     let assetVideoTrack = asset.tracksWithMediaType(AVMediaTypeVideo).first! as AVAssetTrack 
     let assetAudioTrack = asset.tracksWithMediaType(AVMediaTypeAudio).first! as AVAssetTrack 

     var duration : CMTimeRange? = nil 
     duration = CMTimeRangeMake(kCMTimeZero, asset.duration) 

     do { 
      try videoTrack.insertTimeRange(duration!, ofTrack: assetVideoTrack, atTime: cursorTime) 
      try audioTrack.insertTimeRange(duration!, ofTrack: assetAudioTrack, atTime: cursorTime) 
     }catch { 
      print(error) 
     } 
     cursorTime = CMTimeAdd(cursorTime, asset.duration) 
    } 

    let directory = NSTemporaryDirectory() 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = .LongStyle 
    dateFormatter.timeStyle = .ShortStyle 
    let date = dateFormatter.stringFromDate(NSDate()) 
    let savePath = "\(directory)/mergedVideo-\(date).mp4" 
    let url = NSURL(fileURLWithPath: savePath) 

    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) 
    exporter!.outputURL = url 
    exporter!.shouldOptimizeForNetworkUse = true 
    exporter!.outputFileType = AVFileTypeMPEG4 

    exporter!.exportAsynchronouslyWithCompletionHandler({() -> Void in 
     let outputURL = exporter!.outputURL 

     switch exporter!.status { 
     case .Completed : 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       callback(error: nil, outURL: outputURL) 
      }) 
     default: 
      callback(error: CCMovieWriterError.CannotMergeClips, outURL: nil) 
     } 

    }) 
}