2015-10-06 21 views
7

Video bir fotoğrafın Canlı Fotoğraftan nasıl çıkarılacağını anlayan var mı? Canlı Fotoğrafı bir GIF'e dönüştürmek için bir uygulama üzerinde çalışıyorum ve ilk adım Canlı Fotoğraf'tan video dosyası almak. Mümkün gibi görünüyor, çünkü bir Mac'e telefonunuzu takarsanız, ayrı görüntü ve video dosyalarını görebilirsiniz. Ayıklama işleminde bir tuğla duvara koştum ve bunu yapmak için birçok yol denedim ve hepsi başarısız.Canlı Fotoğraftan video bölümünü ayıkla

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 { 

denedim bir AVAsset için PHAsset dönüştürmek için:

İlk yaptığım düşündüğüm şey için bir PHAsset elde oldu aşağıdakileri yaparak, Canlı Fotoğraf video parçasıdır:

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

Ben duration.value ile ayıklama baskı 0. Ben de ".mov" Ayrıca olmadan denedim ve hala çalışmıyor verir çünkü bu bir çalıştığını sanmıyorum.

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

Ve nil debugPrint (avAsset) baskılar yüzden çalışmıyor:

Ben de denedim.

Yapmaları imkansız kılmaları muhtemel olsa da, sanki PHAsset'in hala bir Canlı Fotoğraf ve aslında bir video değil gibi göründüğünden beri çevrelere gidiyorum gibi görünüyor.

cevap

16

Video dosyasını PHAssetResource'dan almak için PHAssetResourceManager'u kullanın.

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

Bu yalnızca 9.1 ile çalışır, Daha genel bir çözümünüz var mı? – Idan

+12

Live Photo özel API'leri iOS 9.1'de tanıtıldı – Hendrik

-2

Yanlışlıkla yaptım. Windows benzeri bir dosya yöneticisi özellikli Goodreader (appstore'da mevcut) adlı bir ios uygulamasına sahibim. Canlı bir fotoğraf içe aktarılırken, içindeki jpg ve mov dosyalarını içeren .pvt ile biten bir klasör olarak kaydedilecektir. Sadece bir uyarı var: fotoğraf uygulamasından değil, "iyi bir okuyucuya içe aktar" seçeneğini görmek için kendinize veya başka birine gönderdikten sonra canlı fotoğrafın mesajlar uygulamasından açılmasını sağlayın.

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 
} 
İlgili konular