当用户尝试在 IOS 14、swift 5 中使用具有选定照片权限的 PHPickerViewController 检索视频时,获取视频数据为零

Hee*_*ena 7 ios swift ios14 phpickerviewcontroller

在 iOS 14 中,Apple 引入了PHPickerViewController 用户有权访问所有照片库视频或选定视频的权限。在第一种情况下,当我们向所有视频提供权限时,我们能够从照片库中获取视频并将其转换为视频数据以将其发送到后端服务器。

但在第二种情况下,当用户向选定的视频提供权限时,在这种情况下,我们可以从照片库中获取视频,但无法将其转换为本地视频 url 中的数据。此时数据始终为零。

我们使用下面的代码从照片库 url 检索视频并将其转换为数据。

// MARK: PHPickerViewControllerDelegate Methods
extension PhotoPickerVC: PHPickerViewControllerDelegate {
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // Always dismiss the picker first
        dismiss(animated: true)
        if !results.isEmpty {
            guard let itemProvider = results.first?.itemProvider else { return }
            
            itemProvider.loadItem(forTypeIdentifier: "public.movie", options: nil) { [weak self] (fileURL, _) in
                DispatchQueue.main.async {
                    guard let videoURL = fileURL as? URL, let _ = self else { return }
                    do {
                        //mediaURL video loading
                        print(videoURL)
                        let VideoData = try Data(contentsOf: videoURL, options: Data.ReadingOptions.alwaysMapped)
                        print(VideoData)
                    } catch _ {
                        print("Received nil VideoData")
                    }
                }
            }
            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 10

这行是错误的:

itemProvider.loadItem(forTypeIdentifier: "public.movie", options: nil) { [weak self] (fileURL, _) in
Run Code Online (Sandbox Code Playgroud)

您不应该尝试加载任何项目。您无法将视频保存在内存中!您应该要求提供商将数据保存到磁盘。我使用这种代码:

let movie = UTType.movie.identifier
itemProvider.loadFileRepresentation(forTypeIdentifier: movie) { url, err in
Run Code Online (Sandbox Code Playgroud)

请注意,您必须立即检索 URL,因为这是临时位置,文件将被删除。如果您想将文件保留在磁盘上,则必须将其同步(在后台)复制到其他位置。

同样,不要将文件中的数据直接读入内存。保存后即可播放磁盘上的视频;这就是它的用途。