Что делать для видео PHAsset

Я вижу, что для PHContentEditingInput (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHContentEditingInput_Class/index.html#//apple_ref/occ/instp/PHContentEditingInput/), видеоресурсы устарели.

Если мне нужно обработать видео, что я должен использовать вместо этого?

(В частности, NSURL от PHAsset, они использовали эту устаревшую функцию здесь. Есть ли что-то еще, что я мог бы использовать это не устарело, но может получить NSURL?)

РЕДАКТИРОВАТЬ: Итак ... после того, как я немного ознакомился с фреймворком AVFoundation ... Как именно мы конвертируем наш PHAsset в AVURLAsset без использования устаревшего метода?


person dcheng    schedule 15.06.2015    source источник


Ответы (4)


Документация для iOS 9 не обновлялась (полагаю, пока). Но если вы посмотрите на заголовок PHContentEditingInput.h (или сгенерированный интерфейс Swift) в Xcode, вы увидите, что это просто переименование - avAsset устарело в пользу audiovisualAsset. Он по-прежнему возвращает объект AVAsset, который затем можно обработать с помощью AVFoundation.

person rickster    schedule 16.06.2015

Если мне нужно обработать видео, что я должен использовать вместо этого

Полагаю, это зависит от того, что вы подразумеваете под «процессом», но в целом вам следует использовать AVFoundation.

person matt    schedule 15.06.2015
comment
Ой, подождите ... они удалили видео из фреймворка "Фото" и предоставили для него совершенно новый фреймворк? И под процессом я имею в виду все, что вы могли делать с avAsset раньше. Я только начал, поэтому не совсем уверен, что мне для этого нужно. - person dcheng; 16.06.2015
comment
Предположительно, вы бы не использовали PHContentEditingInput в этой ситуации. Это для редактирования фотографий, особенно в расширении фотографий. - person matt; 16.06.2015
comment
Итак, в настоящее время я просматриваю свои активы, и некоторые из них являются видео ... Они в настоящее время хранятся как PHAsset. Как мне заставить их стать AVURLAsset без использования этого метода? - person dcheng; 16.06.2015
comment
У меня есть подозрение, что это будет иметь какое-то отношение к новому классу PHAssetResource, но я еще не смотрел новое видео WWDC по этой теме, а документы не обновлялись, так что это всего лишь предположение. - person matt; 16.06.2015

Какой тип URL-адреса вы ищете в объекте AVURLAsset? Есть два варианта, и различие всегда актуально (например, возьмите URL-адрес, сгенерированный UIImagePickerController, и URL-адрес, используемый AVAssetReader / Writer). Они здесь:

[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
    NSURL *url = (NSURL *)[[(AVURLAsset *)avAsset URL] fileReferenceURL];
    NSLog(@"url = %@", [url absoluteString]);
    NSLog(@"url = %@", [url relativePath]);
 }];

В то время как phAsset - это объект PHAsset, а avAsset - это результирующий объект AVAsset, сгенерированный PHImageManager, вывод на консоль из приведенного выше кода будет производить, например:

2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = file:///.file/id=16777218.8262005
2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = /private/var/mobile/Media/DCIM/108APPLE/IMG_8421.MOV

Думаю, есть нечто большее, чем просто эти двое, но начнем с этого.

person James Bush    schedule 16.04.2016

Для Swift 2.0

Импортировать файл

import AVKit

От PHAsset

static func playVideo (view:UIViewController, asset:PHAsset) {

        guard (asset.mediaType == PHAssetMediaType.Video)

            else {
                print("Not a valid video media type")
                return
        }

        PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) in

            let asset = asset as! AVURLAsset   // you are looking for

            dispatch_async(dispatch_get_main_queue(), {

                let player = AVPlayer(URL: asset.URL)
                let playerViewController = AVPlayerViewController()
                playerViewController.player = player
                view.presentViewController(playerViewController, animated: true) {
                    playerViewController.player!.play()
                }
            })
        })
    }
person Sazzad Hissain Khan    schedule 22.09.2016