从Live Photo中提取视频部分

时间:2015-10-06 00:37:06

标签: ios video avasset phasset phlivephoto

有没有人想出如何从实时照片中提取视频部分?我正在开发一个应用程序,将Live Photos转换为GIF,第一步是从Live Photo获取视频文件。它似乎应该是可能的,因为如果您将手机插入Mac,您可以看到单独的图像和视频文件。我在提取过程中碰到了一堵砖墙,我尝试了很多方法,但都失败了。

我做的第一件事就是通过以下方式获取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)打印nil,因此无效。

我有点害怕他们可能无法做到,似乎我已经进入了圈子,因为看起来我得到的PHAsset仍然是Live Photo而不是视频。

3 个答案:

答案 0 :(得分:15)

使用PHAssetResourceManagerPHAssetResource获取视频文件。

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

注意:iOS 9.1中引入了Live Photo特定API

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

我不小心做了。我有一个名为Goodreader的ios应用程序(在appstore中可用),它具有类似Windows的文件管理器。导入实时照片时,它会将其保存为以.pvt结尾的文件夹,其中包含jpg和mov文件。只有一点需要注意:您需要在将消息发送给自己或其他人后才能在消息应用中打开实时照片,以便查看"导入到goodreader"选项,而不是照片应用程序。