Извлечь часть видео из Live Photo

Кто-нибудь разобрался, как извлечь видео из живого фото? Я работаю над приложением, которое конвертирует живые фотографии в GIF, и первым шагом является получение видеофайла из живого фото. Кажется, это должно быть возможно, потому что если вы подключите свой телефон к 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) печатает ноль, поэтому он не работает.

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

3 ответа

Решение

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

PHAssetResourceManager.defaultManager().writeDataForAssetResource(assetRes, 
    toFile: fileURL, options: nil, completionHandler: 
  {
     // Video file has been written to path specified via fileURL
  }
// 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
}

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

Другие вопросы по тегам