2016-04-23 11 views
1

Ich habe einen Fehler und ein Problem. Ich möchte ein geändertes Video in eine Kamerarolle exportieren, aber das exportierte Video ist nicht mit der Kamerarolle kompatibel.AVAssetExportSession - exportierte Video nicht kompatibel mit der Kamera roll

Ich möchte auch das erste aufgezeichnete Video entfernen, so dass ich mehr als einmal aufnehmen kann, aber es erzeugt einen Fehler und es ergibt keinen Sinn. Wenn ich den Code auskommentiere, wird ein Fehler angezeigt, der mir sagt, dass der letzte Pfad nicht existiert. Ich nehme an, dass dies den ersten Film löscht, BEVOR die modifizierte Version exportiert wird. Aber ich verstehe nicht, warum das passiert, da der Entfernungscode UNTER dem Exportcode ist.

Hier ist der Code:

// Create Date Formatter 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd-hh-mm-ss" 

    // Create Export Session 
    let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) 
    exportSession?.videoComposition = videoComposition 
    do { 
     try exportSession?.outputURL = NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true).URLByAppendingPathComponent(dateFormatter.stringFromDate(NSDate())).URLByAppendingPathExtension("mov") 
    } 
    catch { 
     print(error) 
    } 
    exportSession?.outputFileType = AVFileTypeQuickTimeMovie 
    exportSession?.exportAsynchronouslyWithCompletionHandler({ 
     print("Output File Type: \(exportSession?.outputFileType)") 
     print("Output URL: \(exportSession?.outputURL?.absoluteString)") 
     print("Video Compatible W/ Camera Roll: \(exportSession?.asset.compatibleWithSavedPhotosAlbum)") 
     //-----SAVE----- 
     if exportSession?.status == AVAssetExportSessionStatus.Completed 
      { 
      print("Export Finished") 
      if UIVideoAtPathIsCompatibleWithSavedPhotosAlbum((exportSession?.outputURL?.absoluteString)!) //Returns false... 
      { 
       UISaveVideoAtPathToSavedPhotosAlbum((exportSession?.outputURL?.absoluteString)!, self, nil, nil) 
       print("Video Saved") 
       // Show Message 
       self.showMessage() 
      } 
      else 
      { 
       print("Video Not Saved") 
      } 
     } 
     else if exportSession?.status == AVAssetExportSessionStatus.Failed 
     { 
      print("Export Error: \(exportSession?.error)") 
      print("Export Failed") 
     } 
     else 
     { 
      print("Export Cancelled") 
     } 
    }) 

    // The code below generates an error 
    // Remove Temporary Video 
//  do 
//  { 
//   try NSFileManager.defaultManager().removeItemAtURL(initialOutputURL) 
//  } 
//  catch 
//  { 
//   print(error) 
//  } 

Also, wo ist die Unvereinbarkeit von? Ich möchte feststellen, dass das Protokoll ein QuickTime-Format und eine Auflösung von 720x720 zeigt.

Antwort

0

Ok, so fand ich schließlich die Antwort ... was auch nicht viel Sinn macht. Vielleicht hilft es anderen, die auf dieses Problem stoßen.

So muss der Code zum Entfernen des ursprünglichen Videos innerhalb der exportAsynchronouslyWithCompletionHandler und nicht nach.

das Video speichern ich ALAssetLibrary verwendet nur, .videoAtPathIsCompatibleWithSavedPhotosAlbum und .writeVideoAtPathToSavedPhotosAlbum. Ich weiß, dass es veraltet ist, aber ich möchte auch Kompatibilität mit iOS 7. Wenn Sie von iOS 8 und höher möchten, verwenden Sie die PHPhotoLibrary. Das ist sehr merkwürdig, da sowohl mein ursprünglicher Code als auch die ALAssetLibrary-Version genau dasselbe tun. Außerdem ist das lustige daran, dass das Log immer noch zeigt, dass das Video nicht mit der Kamerarolle kompatibel ist.

Der letzte Fix ist CGFloat(M_PI_2) anstelle von 90 beim Drehen des Videos zu verwenden.