【问题标题】:Data contentsOf return nil for URL from AVURLAsset来自 AVURLAsset 的 URL 的数据内容返回 nil
【发布时间】:2018-02-05 04:19:44
【问题描述】:

我想知道为什么 contentsOf 对来自 AVURLAsset 的 URL 返回 nil。从带有 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
  }
}

上面网址的视频可以用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."
 }

【问题讨论】:

  • 使用do/catch 并记录错误。
  • 谢谢建议,说我没有权限打开,让我更新问题
  • 您能告诉我您使用哪个自定义库来获取 PHAsset,您是否从该库中获取了正确的 PHAsset?

标签: ios swift avurlasset


【解决方案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)
                    }
                }
            }

        }
    }

(注意:请不要忘记添加隐私-访问设备或模拟器的照片库的照片库使用说明权限)

【讨论】:

  • 嘿@Kesong 你觉得我的回答有帮助吗?
  • 我也是这样做的,但是使用 Data 构造函数无法访问从 AVURLAsset 返回的 URL
  • 请仔细阅读此源代码,以防它对您更有帮助。 dropbox.com/s/cp6882fqv62cbv3/VideoDataSO.zip?dl=0
  • 谢谢,我去看看
  • 如果你能接受我的回答,我将不胜感激!
猜你喜欢
  • 2013-10-08
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多