2015-10-06 3 views
7

Кто-нибудь понял, как извлечь видеоролик из Live Photo? Я работаю над приложением для преобразования Live Photos в GIF, и первым шагом является получение видеофайла из Live Photo. Похоже, это должно быть возможно, потому что если вы подключите свой телефон к Mac, вы можете увидеть отдельные изображения и видеофайлы. Я как-то столкнулся с кирпичной стеной в процессе извлечения, и я пробовал много способов сделать это, и все они терпят неудачу.Извлечь видеоролик из Live Photo

Первое, что я сделал получить PHAsset за то, что я думаю, что это видео часть Live Photo, выполнив следующие действия:

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 { 

Чтобы преобразовать PHAsset к AVAsset я пробовал:

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

Я не думаю, что это работает, потому что отладка печать с duration.value дает 0. Я также попробовал без «.mov» Кроме того, и это до сих пор не работает.

Я также попытался:

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

И DebugPrint (avAsset) печатает нильполугруппы так это не работает.

Я боюсь, что они могли сделать это невозможным, кажется, что я собираюсь в круги, потому что кажется, что PHASset, который я получил, по-прежнему является Live Photo, а не на самом деле видео.

ответ

16

Используйте PHAssetResourceManager, чтобы получить видеофайл с PHAssetResource.

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

Это работает только с 9.1, имеет общее общее решение? – Idan

+12

В iOS 9.1 были введены специфические API для Live Photo – Hendrik

-2

Я случайно сделал. У меня есть приложение ios под названием Goodreader (доступно в AppStore), в котором есть файловый менеджер, похожий на Windows. При импорте живого фото он сохранит его как папку, заканчивающуюся на .pvt, содержащую файлы jpg и mov. Существует только одна оговорка: вам нужно открыть живое фото из приложения для сообщений после того, как вы отправили его себе или кому-либо другому, чтобы увидеть параметр «импорт для хорошего читателя», а не приложение для фотографий.

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 
}