You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:50:27