2

在 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")
                    }
                }
            }
            
        }
    }
}
4

1 回答 1

2

这一行是错误的:

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

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

let movie = UTType.movie.identifier
itemProvider.loadFileRepresentation(forTypeIdentifier: movie) { url, err in

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

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

于 2021-05-20T02:02:53.977 回答