2015-10-06 5 views
7

Hat jemand herausgefunden, wie man den Videoanteil von einem Live Photo extrahiert? Ich arbeite an einer App, um Live-Fotos in ein GIF zu konvertieren, und der erste Schritt besteht darin, die Videodatei von Live Photo zu erhalten. Es scheint, dass es möglich sein sollte, denn wenn Sie Ihr Telefon an einen Mac anschließen, können Sie die separaten Bild- und Videodateien sehen. Ich bin beim Extraktionsprozess in eine Ziegelmauer gerannt, und ich habe viele Möglichkeiten ausprobiert, und alle versagen.Videoabschnitt von Live Photo extrahieren

Das erste, was ich war für eine PHAsset erhalten tat, was ich denke, ist der Video-Teil des Live Photos, indem Sie folgendermaßen vorgehen:

if let livePhoto = info["UIImagePickerControllerLivePhoto"] as? PHLivePhoto { 
     let assetResources = PHAssetResource.assetResourcesForLivePhoto(livePhoto) 
     for assetRes in assetResources { 
      if (assetRes.type == .PairedVideo) { 
       let assets = PHAsset.fetchAssetsWithLocalIdentifiers([assetRes.assetLocalIdentifier], options: nil) 
       if let asset = assets.firstObject as? PHAsset { 

Um die PHAsset zu einem AVAsset konvertiert ich versucht habe:

asset.requestContentEditingInputWithOptions(nil, completionHandler: { (contentEditingInput, info) -> Void in 

     if let url = contentEditingInput?.fullSizeImageURL { 
      let movieUrl = url.absoluteString + ".mov" 
      let avAsset = AVURLAsset(URL: NSURL(fileURLWithPath: movieUrl), options: nil) 
      debugPrint(avAsset) 
      debugPrint(avAsset.duration.value) 
     } 
    }) 

ich glaube nicht, diese funktioniert, weil der Debug-Druck mit dem duration.value 0 gibt habe ich auch ohne die „.mov“ außerdem versucht und es funktioniert immer noch nicht.

ich auch versucht:

PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: { (avAsset, audioMix, info) -> Void in 
     debugPrint(avAsset) 
    }) 

Und die debugPrint (avAsset) druckt nil so funktioniert es nicht.

Ich habe irgendwie Angst, dass sie es unmöglich gemacht haben, es scheint, als würde ich im Kreis gehen, da es scheint, dass das PHAsset immer noch ein Live-Foto und eigentlich kein Video ist.

Antwort

16

Verwenden Sie die, um die Videodatei von der PHAssetResource zu erhalten.

PHAssetResourceManager.defaultManager().writeDataForAssetResource(assetRes, 
    toFile: fileURL, options: nil, completionHandler: 
    { 
    // Video file has been written to path specified via fileURL 
    } 
+0

Dies funktioniert nur mit 9.1, Haben Sie eine allgemeinere Lösung? – Idan

+12

Die Live Photo-spezifischen APIs wurden in iOS 9.1 eingeführt – Hendrik

-2

Ich versehentlich getan. Ich habe eine iOS-App namens Goodreader (verfügbar im Appstore), die einen Windows-ähnlichen Dateimanager bietet. Wenn Sie ein Live-Foto importieren, wird es als Ordner gespeichert, der auf .pvt endet und die darin enthaltenen JPG- und MOV-Dateien enthält. Es gibt nur eine Einschränkung: Sie müssen das Live-Foto in der Nachrichten-App öffnen, nachdem Sie es an sich selbst oder eine andere Person gesendet haben, um die Option "Import in Goodreader" zu sehen, nicht über die Foto-App.

2
// suppose you have PHAsset instance (you can get it via [PHAsset fetchAssetsWithOptions:...]) 

PHAssetResource *videoResource = nil; 
NSArray *resourcesArray = [PHAssetResource assetResourcesForAsset:asset]; 

const NSInteger livePhotoAssetResourcesCount = 2; 
const NSInteger videoPartIndex = 1; 

if (resourcesArray.count == livePhotoAssetResourcesCount) { 
    videoResource = resourcesArray[videoPartIndex]; 
} 

if (videoResource) { 
    NSString * const fileURLKey = @"_fileURL"; 
    NSURL *videoURL = [videoResource valueForKey:fileURLKey]; 

    // load video url using AVKit or AVFoundation 
}