如何从 PHPickerViewController 委托获取实时照片或视频

Posted

技术标签:

【中文标题】如何从 PHPickerViewController 委托获取实时照片或视频【英文标题】:How to fetch live photo or video from PHPickerViewController delegate 【发布时间】:2020-08-13 14:09:05 【问题描述】:

Apple 的新 ios 14 phpickerViewController 委托仅接收 NSItemProvider。 2020 WWDC 视频展示了如何从那里获取 UIImage:

    let prov = result.itemProvider
    prov.loadObject(ofClass: UIImage.self)  im, err in
        if let im = im as? UIImage 
            DispatchQueue.main.async 
                // display the image here

但是如果用户选择了实况照片或视频呢?我们如何得到它?

【问题讨论】:

【参考方案1】:

实时照片很容易;以完全相同的方式进行。你可以这样做,因为 PHLivePhoto 是一个类。所以:

    let prov = result.itemProvider
    prov.loadObject(ofClass: PHLivePhoto.self)  livePhoto, err in
        if let photo = livePhoto as? PHLivePhoto 
            DispatchQueue.main.async 
                // display the live photo here

视频更难。问题是您不想收到数据;它对你没有好处,而且可能很大。您希望将数据保存到磁盘,以便您可以访问视频 URL,就像 UIImagePickerController 过去所做的那样。实际上,您可以要求项目提供者为您保存其数据,但它希望在完成处理程序返回时释放该数据。我的解决方案是在 .sync 函数中访问 URL:

    let prov = result.itemProvider
    prov.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier)  url, err in
        if let url = url 
            DispatchQueue.main.sync 
                // display the video here

【讨论】:

我想知道为什么 PHPickerViewController 不处理直接引用 PHAsset 来创建可以播放或导出的视频 AVAsset?当我选择项目并加载选定的 PHAsset 时,它会请求照片库的权限。但是,当用户已经在选择器中选择了这些项目时,为什么还需要这样做呢? @DeepakSharma 请作为一个单独的问题提出。 已经在这里问过***.com/questions/64223430/…

以上是关于如何从 PHPickerViewController 委托获取实时照片或视频的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?