如何在PhotosPicker中用户选视频后立即检测时长以限制上传?
无需存储即可检测PhotosPicker选中视频的时长
iOS 14+ 原生推荐方案
借助PHPicker的NSItemProvider,可以直接在内存中加载选中的视频为AVAsset,无需写入本地存储就能获取时长:
实现代码
- 初始化并展示选择器:
let config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared()) config.filter = .videos config.selectionLimit = 1 let picker = PHPickerViewController(configuration: config) picker.delegate = self present(picker, animated: true)
- 处理选中结果:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) guard let result = results.first else { return } guard result.itemProvider.canLoadObject(ofClass: AVAsset.self) else { // 处理不支持的资源类型 return } result.itemProvider.loadObject(ofClass: AVAsset.self) { [weak self] asset, error in guard let videoAsset = asset as? AVAsset, error == nil else { // 处理加载失败 return } let duration = CMTimeGetSeconds(videoAsset.duration) DispatchQueue.main.async { if duration > 20 { // 触发超时时长操作,例如下发提示 let alert = UIAlertController(title: "提示", message: "视频时长不得超过20秒", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self?.present(alert, animated: true) } else { // 处理合规视频 } } } }
关键优势
- 无需将视频写入本地存储,内存中直接处理,性能更优
- 无需申请照片库读写权限,仅依赖用户主动选择,符合iOS隐私要求
- 支持批量选择检测(调整
selectionLimit即可)
iOS 13及以下兼容方案
如果需要适配旧版本系统,可使用UIImagePickerController配合PHAsset实现:
实现代码
- 初始化选择器:
let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.mediaTypes = ["public.movie"] picker.delegate = self present(picker, animated: true)
- 获取视频时长:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) guard let assetURL = info[.mediaURL] as? URL else { return } let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil) guard let asset = fetchResult.firstObject else { return } let duration = asset.duration if duration > 20 { // 触发超时时长操作 } }
注意事项
- 需要在
Info.plist中添加NSPhotoLibraryUsageDescription申请照片库读取权限 - 依赖
PHAsset的获取,需确保用户已授予对应权限
内容的提问来源于stack exchange,提问作者Swink
相关产品推荐
相关产品推荐

