如何用PHPickerFilter仅显示空间视频?及空间视频识别方法
仅获取空间视频及判断方法
一、打开相册时仅筛选空间视频
要在PHPickerViewController中只展示空间视频,不能直接使用.videos通用过滤器,需要通过PHAsset谓词精准筛选。空间视频对应的PHAsset媒体子类型为.videoSpatial(iOS 16.4+支持),基于该条件构建过滤器即可:
修改presentPicker方法的过滤器配置:
self.presentPicker(filter: .predicate(NSPredicate(format: "mediaSubtypes CONTAINS %d", PHAssetMediaSubtype.videoSpatial.rawValue))) /// - Tag: PresentPicker private func presentPicker(filter: PHPickerFilter?) { var configuration = PHPickerConfiguration(photoLibrary: .shared()) // 配置仅显示空间视频的过滤器 configuration.filter = filter configuration.preferredAssetRepresentationMode = .current configuration.selection = .ordered configuration.selectionLimit = 1 let picker = PHPickerViewController(configuration: configuration) picker.delegate = self present(picker, animated: true) }
配置完成后,Picker将只展示相册中的空间视频,普通视频会被自动过滤。
二、判断选中的视频是否为空间视频
选中视频后,可通过获取对应的PHAsset,检查其mediaSubtypes是否包含.videoSpatial来判断:
修改picker(_:didFinishPicking:)方法,添加PHAsset的获取与判断逻辑:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) { // 关闭Picker后的操作 } guard let result = results.first else { return } // 通过assetIdentifier获取PHAsset,判断是否为空间视频 if let assetId = result.assetIdentifier { PHAsset.fetchAssets(withLocalIdentifiers: [assetId], options: nil).enumerateObjects { asset, _, _ in let isSpatialVideo = asset.mediaSubtypes.contains(.videoSpatial) print("该视频是否为空间视频:\(isSpatialVideo)") // 继续原有视频文件加载逻辑 if let provider = result.itemProvider { provider.loadFileRepresentation(forTypeIdentifier: "public.movie") { url, error in guard error == nil, let url = url else { print(error ?? "视频文件加载失败") return } // 后续文件处理 let fileName = "\(Int(Date().timeIntervalSince1970)).\(url.pathExtension)" let newUrl = URL(fileURLWithPath: NSTemporaryDirectory() + fileName) print(newUrl) } } } } }
注意事项
- 需在Info.plist中配置
NSPhotoLibraryUsageDescription,确保App已获取相册访问权限。 .videoSpatial仅支持iOS 16.4及以上版本,若需兼容更低版本,可通过解析视频文件的元数据(如查看视频轨道的空间属性)来判断。
内容的提问来源于stack exchange,提问作者Sam007
相关产品推荐
相关产品推荐

