2015-10-06 38 views
7

Có ai đã tìm ra cách trích xuất phần video từ Live Photo không? Tôi đang làm việc trên một ứng dụng để chuyển đổi Live Photos thành GIF, và bước đầu tiên là lấy tệp video từ Live Photo. Có vẻ như nó sẽ là có thể, bởi vì nếu bạn cắm điện thoại vào máy Mac, bạn có thể thấy các tập tin hình ảnh và video riêng biệt. Tôi đã chạy vào một bức tường gạch trong quá trình khai thác, và tôi đã thử nhiều cách để làm điều đó và tất cả đều thất bại.Trích xuất phần video từ Live Photo

Việc đầu tiên tôi làm là có được một PHAsset cho những gì tôi nghĩ là phần video của Live Photo, bằng cách làm như sau:

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 { 

Để chuyển đổi các PHAsset một AVAsset Tôi đã thử:

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

tôi không nghĩ rằng một trong các công trình này vì in debug với duration.value cho 0. tôi cũng đã cố gắng mà không có sự "mov" Ngoài ra và nó vẫn không hoạt động.

Tôi cũng đã cố gắng:

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

Và debugPrint (avAsset) in bằng không vì thế nó không hoạt động.

Tôi lo sợ rằng họ có thể đã làm cho nó không thể làm được, có vẻ như tôi đang đi trong vòng kết nối vì có vẻ như PHAsset tôi nhận vẫn là Ảnh sống và không thực sự là video.

Trả lời

16

Sử dụng PHAssetResourceManager để tải tệp video từ PHAssetResource.

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

Chỉ hoạt động với 9.1, Bạn có giải pháp tổng quát hơn? – Idan

+12

API cụ thể của Live Photo được giới thiệu trong iOS 9.1 – Hendrik

-2

Tôi vô tình đã làm. Tôi có một ứng dụng ios được gọi là Goodreader (có sẵn trong appstore) có tính năng quản lý tập tin giống như cửa sổ. Khi nhập ảnh trực tiếp, ảnh sẽ lưu nó dưới dạng thư mục kết thúc bằng .pvt chứa tệp jpg và mov trong đó. Chỉ có một báo trước: bạn cần phải mở ảnh trực tiếp từ trong ứng dụng tin nhắn sau khi bạn đã gửi cho chính mình hoặc người khác xem tùy chọn "nhập vào trình phân tích" chứ không phải từ ứng dụng ảnh.

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 
} 
Các vấn đề liên quan