Данные о содержимом возврата nil для URL-адреса из AVURLAsset

Интересно, почему contentOf возвращает ноль для URL-адреса из AVURLAsset. Выбрав из пользовательской библиотеки с фреймворком Photos, я попытался запросить ресурс у PHAsset следующим образом:

PHCachingImageManager().requestAVAsset(forVideo: asset, options: nil) { (avAsset, _, _) in
 DispatchQueue.main.async {
 guard let asset = avAsset as? AVURLAsset else {
     return
 }
 print(asset.url) // file:///var/mobile/Media/DCIM/101APPLE/IMG_1513.MP4
  }
}

Видео с указанным выше URL может нормально отображаться с помощью AVPlayer. Но когда я пытаюсь получить данные, связанные с URL-адресом, используя:

 do {
   let videoData = try Data(contentsOf: mediaURL!)
 } catch (let error){
     print(error.localizedDescription ?? "") // "The file “IMG_1490.MP4” couldn’t be opened because you don’t have permission to view it."
 }

person Kesong Xie    schedule 05.02.2018    source источник
comment
Используйте do/catch и запишите ошибку.   -  person rmaddy    schedule 05.02.2018
comment
Спасибо за предложение, в нем говорится, что у меня нет разрешения на его открытие, позвольте мне обновить вопрос   -  person Kesong Xie    schedule 05.02.2018
comment
Не могли бы вы сказать мне, какую пользовательскую библиотеку вы используете для получения PHAsset и получаете ли вы правильный PHAsset из этой библиотеки?   -  person iOS Team    schedule 05.02.2018


Ответы (1)


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

Свифт 4

    override func viewDidLoad() {
        super.viewDidLoad()

        //For fetching Videos from Photo Library.
        let phFetchOptions = PHFetchOptions()
        phFetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",
                                                           ascending: false)]
        phFetchOptions.predicate = NSPredicate(format: "mediaType == %d",
                                               PHAssetMediaType.video.rawValue)
        phFetchOptions.fetchLimit = 2
        let videoPhAssetResult = PHAsset.fetchAssets(with:phFetchOptions)
        print(videoPhAssetResult.count)
        let videoPHAsset = videoPhAssetResult.object(at: 0)

        //For Fetching AvAsset from PHAsset and along with that getting Data from AvAsset
        PHCachingImageManager().requestAVAsset(forVideo:videoPHAsset , options: nil) { (vidAvAsset, _, _) in
            DispatchQueue.main.async {
                if vidAvAsset != nil {
                    let assetURL = vidAvAsset as? AVURLAsset
                    print(assetURL?.url)
                    do {
                        let videoData = try Data(contentsOf:(assetURL?.url)!)
                        print(videoData)
                    } catch (let error){
                        print(error.localizedDescription)
                    }
                }
            }

        }
    }

(Примечание: не забудьте добавить разрешение «Конфиденциальность — описание использования библиотеки фотографий» для доступа к библиотеке фотографий устройства или симулятора)

person iOS Team    schedule 06.02.2018
comment
Привет, @Kesong. Мой ответ был полезен? - person iOS Team; 07.02.2018
comment
Я сделал то же самое, но URL-адрес, возвращаемый из AVURLAsset, недоступен с помощью конструктора данных. - person Kesong Xie; 07.02.2018
comment
Пожалуйста, просмотрите этот исходный код, на случай, если он покажется вам более полезным. dropbox.com/s/cp6882fqv62cbv3/VideoDataSO.zip?dl=0< /а> - person iOS Team; 07.02.2018
comment
Спасибо, посмотрю - person Kesong Xie; 07.02.2018
comment
Я был бы признателен, если бы вы могли принять мой ответ! - person iOS Team; 07.02.2018