2015-10-06 11 views
7

Qualcuno ha capito come estrarre la parte video da una Live Photo? Sto lavorando a un'app per convertire le Foto dal vivo in una GIF e il primo passo è ottenere il file video dalla Live Photo. Sembra che dovrebbe essere possibile, perché se colleghi il tuo telefono a un Mac puoi vedere l'immagine separata e i file video. Mi sono imbattuto in un muro di mattoni nel processo di estrazione, e ho provato molti modi per farlo e falliscono tutti.Estrai parte video da Live Photo

La prima cosa che ho fatto è stato ottenere una PHAsset per quello che penso sia la parte video del Live Photo, effettuando le seguenti operazioni:

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 { 

Per convertire il PHAsset a un AVAsset ho provato:

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

non credo che questo funziona perché la stampa di debug con l'duration.value dà 0. ho anche provato, senza l'aggiunta ".mov" e ancora non funziona.

Ho anche provato:

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

E i debugPrint (avAsset) stampe nil modo che non funziona.

Ho paura che potrebbero aver reso impossibile farlo, sembra che vada in circolo perché sembra che il PHAsset che ho ottenuto sia ancora una Live Photo e non in realtà un video.

risposta

16

Utilizzare PHAssetResourceManager per ottenere il file video da PHAssetResource.

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

Questo funziona solo con 9.1, avere una soluzione più generale? – Idan

+12

Le API specifiche di Live Photo sono state introdotte in iOS 9.1 – Hendrik

-2

L'ho fatto per errore. Ho una app ios chiamata Goodreader (disponibile nell'appstore) che presenta un file manager simile a Windows. Quando si importa una foto live, la salverà come una cartella che termina in .pvt contenente i file jpg e mov in essa contenuti. C'è solo un avvertimento: devi aprire la foto dal vivo dall'app dei messaggi dopo averlo inviato a te stesso o a qualcun altro per vedere l'opzione "Importa in favore del lettore", non dall'app Foto.

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 
}