2016-04-12 18 views
0

'dan oluşmuyor. Bir videoda filigranların üst üste bindirilebildiği bir uygulama üzerinde çalışıyorum ve şimdiye kadar bunu başarılı bir şekilde yapabildim.AVAssetExportSession ilk kez çalışıyor, ancak yine denediğimde başarısız oluyor - Video,

@IBAction func saveVideo(sender: AnyObject) { 

    self.videoAsset = AVAsset(URL: fileURL as NSURL!) 

    // Create Video track (Video + Audio) 
    let videoTrack: AVMutableCompositionTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 
    let audioTrack:AVMutableCompositionTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 

    do { 
     try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration), ofTrack: self.videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] , atTime: kCMTimeZero) 
     try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration), ofTrack: self.videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0] , atTime: kCMTimeZero) 
     print("Inserted time ranges just fine\n") 
    } catch let error as NSError { 
     print("Failed to insert video/audio tracks!!!!\n") 
     print(error.localizedDescription) 
    } 

    videoLayerIntruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 
    let videoAssetTrack: AVAssetTrack = self.videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] 

    var videoAssetOrientation_: UIImageOrientation = .Up 
    var isVideoAssetPortrait_: Bool = false 

    let videoTransform:CGAffineTransform = videoAssetTrack.preferredTransform 

    if videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0 { 
     videoAssetOrientation_ = .Right 
     isVideoAssetPortrait_ = true 
    } 
    if videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0 { 
     videoAssetOrientation_ = .Left 
     isVideoAssetPortrait_ = true 
    } 
    if videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0 { 
     videoAssetOrientation_ = .Up 
    } 
    if videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0 { 
     videoAssetOrientation_ = .Down 
    } 

    videoLayerIntruction.setTransform(videoAssetTrack.preferredTransform, atTime: kCMTimeZero) 

    mainInstruction.layerInstructions = [videoLayerIntruction] 
    mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration) 


    var naturalSize = CGSize() 

    if isVideoAssetPortrait_ { 
     naturalSize = CGSizeMake(videoAssetTrack.naturalSize.height, videoAssetTrack.naturalSize.width) 
    } else { 
     naturalSize = videoAssetTrack.naturalSize 
    } 

    renderWidth = naturalSize.width 
    renderHeight = naturalSize.height 

    parentLayer.frame = CGRectMake(0, 0, renderWidth, renderHeight) 
    parentLayer.geometryFlipped = true 
    parentLayer.anchorPoint = CGPointMake(0.5, 0.5) 

    videoLayer.frame = CGRectMake(0, 0, renderWidth, renderHeight) 

    self.overlayLayer.frame = CGRectMake(self.renderWidth, self.renderHeight, self.newRatioWidth, self.newRatioHeight) 
    self.overlayLayer.addAnimation(self.animation, forKey: "contents") 
    self.overlayLayer.anchorPoint = CGPointMake(0.5, 0.5) 
    self.overlayLayer.contentsGravity = kCAGravityResizeAspect 

    parentLayer.addSublayer(videoLayer) 

    if addedOverlay == true { 
     parentLayer.addSublayer(overlayLayer) 
    } 

    mainCompositionInst.renderScale = 1.0 
    mainCompositionInst.renderSize = CGSizeMake(renderWidth, renderHeight) 
    mainCompositionInst.instructions = [mainInstruction] 
    mainCompositionInst.frameDuration = CMTimeMake(1, 30) 
    mainCompositionInst.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer) 

    outputURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("CreatedVideo-\(NSUUID().UUIDString).mov") 

    let exporter: AVAssetExportSession = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality)! 
    exporter.outputURL = outputURL 
    exporter.outputFileType = AVFileTypeQuickTimeMovie 
    exporter.shouldOptimizeForNetworkUse = false 
    exporter.videoComposition = mainCompositionInst 

    exporter.exportAsynchronouslyWithCompletionHandler({ 
     dispatch_async(dispatch_get_main_queue(), { 
      self.exportVideo(exporter) 
      switch exporter.status{ 
      case AVAssetExportSessionStatus.Failed: 
       print("FAILED EXPORT - \(exporter.error)\n") 
      case AVAssetExportSessionStatus.Cancelled: 
       print("canceled \(exporter.error)\n") 
      default: 
       print("COMPLETED EXPORT\n") 
      } 
     }) 
    }) 
} 

func exportVideo(sender: AVAssetExportSession) { 
    print("Asked to export\n") 
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
    PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(sender.outputURL!) 
     }, completionHandler: { success, error in 
      if success { 
       print("Success! Finished saving video.") 
      } else { 
       print("ERROR - " + (error?.localizedDescription)!) 
      } 
    }) 
} 
: Aşağıda

Optional(Error Domain=AVFoundationErrorDomain Code=-11841 "Operation Stopped" UserInfo={NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The video could not be composed.})

videoyu kaydetmek için kodum: Ben özel videoyu kaydettikten sonra hata söz konusu olan başarısız videoyu tekrar kaydetmeyi deneyin Ancak, ilk kez bindirmek

Bileşim ilk kez başarılı bir şekilde çalıştıktan sonra bileşimin neden başarısızlığa başladığını bilen var mı? Herhangi bir tavsiye isterim! SeanLintern88 belirttiği gibi

+1

: http://stackoverflow.com/a/31146867/1638273 – SeanLintern88

+0

yeryüzünde nasıl oldu Bunu görmüyorum. Bana aklımı ve şeyleri arama yeteneğimi sorgulatıyor .... Çok SADECE TEŞEKKÜRLER! – riverhawk

+0

@riverhawk Aynı konuyla karşı karşıyayım. @ SeanLintern88 tarafından sağlanan çözüm, yaptığınız şeyle aynı: 'videoLayerIntruction = AVMutableVideoCompositionLayerInstruction (assetTrack: videoTrack)' bu sorunu nasıl çözdü? –

cevap

İlgili konular