Получение URL для PHAsset

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

- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets {
for (PHAsset *asset in assets) {



    NSURL *url = [NSURL URLWithString: assetURLgoesHere];
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
    AVPlayer *videoPlayer = [AVPlayer playerWithPlayerItem:playerItem];


    [videoPlayer play];

}

[self dismissViewControllerAnimated:YES completion:NULL];
}

Это то, что у меня есть на данный момент, но мне нужно получить URL-адрес актива.

Обычно я использую swift, но этот пользовательский сборщик изображений написан на Objective-C. так что я немного объективный нуб

Обновленный код

- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets {
for (PHAsset *asset in assets) {

    - (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset options:(PHVideoRequestOptions *)options resultHandler:(void (^)(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info))resultHandler

    NSURL *url = [NSURL URLWithString: asset];
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
    AVPlayer *videoPlayer = [AVPlayer playerWithPlayerItem:playerItem];


    [videoPlayer play];

}

[self dismissViewControllerAnimated:YES completion:NULL];
}

person Tom Fox    schedule 22.11.2015    source источник


Ответы (6)


Вы должны использовать PHImageManager.

Используйте sharedInstance класса и вызовите этот метод с вашими PHAsset, опциями и обработчиком блока завершения:

- (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset options:(PHVideoRequestOptions *)options resultHandler:(void (^)(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info))resultHandler

Обработчик предоставит вам AVAsset, который вы должны использовать для своего AVPlayerItem, а не URL.

Пример:

[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
  // Use the AVAsset avAsset
  AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
  AVPlayer *videoPlayer = [AVPlayer playerWithPlayerItem:playerItem];
}];

Остерегайтесь его вероятной асинхронности, которая будет мешать потоку вашего приложения.

person Andrew    schedule 22.11.2015
comment
Я пробовал это, но я не уверен, куда поместить этот код. Я пытался поставить его после того, как закончил выбирать активы, но потом получаю сообщение об ошибке. У меня действительно почти нет объективного опыта - person Tom Fox; 23.11.2015
comment
Пожалуйста, добавьте свой обновленный код к своему вопросу, чтобы я мог взглянуть @TomFox - person Andrew; 23.11.2015
comment
Когда я сказал «вызвать» метод, я имел в виду, что вы должны использовать [[PHImageManager sharedInstance] requestAVAssetForVideo...] @TomFox, извините за путаницу. У меня не было под рукой полного фрагмента кода с его использованием, поэтому я просто поместил объявление метода из документации в свой ответ. - person Andrew; 23.11.2015
comment
Я добавил пример. см. также. - person Andrew; 23.11.2015

Кстати, если вам нужен фактический URL-адрес, то есть тот же, который UIImagePickerController передает в AVPlayerItem при его создании, и тот же, который выглядит как 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
comment
Не могли бы вы дать версию Swift 3 для этого. - person Ankit Kumar Gupta; 12.06.2017

Для Swift 3.0 вы можете получить URL-адрес строки для изображения и видео из объекта PHAsset.

asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions(), completionHandler: { (contentEditingInput, dictInfo) in

    if asset.mediaType == .image
    {
      if let strURL = contentEditingInput?.fullSizeImageURL?.absoluteString
      {
         print("IMAGE URL: ", strURL)
      }
    }
    else
    {
      if let strURL = (contentEditingInput!.avAsset as? AVURLAsset)?.url.absoluteString
      {
         print("VIDEO URL: ", strURL)
      }
    }
  })
person Hiren Panchal    schedule 16.12.2016

Правильный ответ @HirenPanchal в Swift 4.0 (также работает в Swift 5.0+) и iOS 9.0+

func getUrlFromPHAsset(asset: PHAsset, callBack: @escaping (_ url: URL?) -> Void)
{
    asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions(), completionHandler: { (contentEditingInput, dictInfo) in

        if let strURL = (contentEditingInput!.audiovisualAsset as? AVURLAsset)?.url.absoluteString
        {
            PRINT("VIDEO URL: \(strURL)")
            callBack(URL.init(string: strURL))
        }
    })
}
person iOS Lifee    schedule 30.08.2018

Получить URL-адрес видео из PHAsset в Swift 4.2 из didFinishPickingAssets в QBImagePickerController

let imagePicker = QBImagePickerController()
imagePicker.delegate = self
imagePicker.numberOfColumnsInPortrait = 2
imagePicker.maximumNumberOfSelection = 2
imagePicker.allowsMultipleSelection = true
imagePicker.mediaType = .video
        
self.present(imagePicker, animated: true, completion: nil)

func qb_imagePickerController(_ imagePickerController: 
QBImagePickerController!, didFinishPickingAssets assets: [Any]!) {
    for asset in assets
    {
        PHCachingImageManager().requestAVAsset(forVideo: asset as! PHAsset, 
        options: nil, resultHandler: {(asset, audioMix, info) -> Void in
            if asset != nil {
                let avasset = asset as! AVURLAsset
                let urlVideo = avasset.url
                yourarray.add(urlVideo as URL)
            }
            
        })

    }

    
    imagePickerController.dismiss(animated: true) {
         //You can access video urls here
         print("Total Videos:\(yourarray.count)")
    }
    
 }
person Mahesh Chaudhari    schedule 24.04.2019

Говоря о URL-адресе видео из PHAsset, я однажды подготовил служебную функцию на Swift 2 (воспроизведение видео из PHAsset). Совместное использование этого ответа может помочь кому-то.

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

Пожалуйста, проверьте этот ответ

person Sazzad Hissain Khan    schedule 20.09.2016