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

如何在PhotosPicker中用户选视频后立即检测时长以限制上传?

无需存储即可检测PhotosPicker选中视频的时长

iOS 14+ 原生推荐方案

借助PHPicker的NSItemProvider,可以直接在内存中加载选中的视频为AVAsset,无需写入本地存储就能获取时长:

实现代码

  1. 初始化并展示选择器:
let config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
config.filter = .videos
config.selectionLimit = 1
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)
  1. 处理选中结果:
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实现:

实现代码

  1. 初始化选择器:
let picker = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.mediaTypes = ["public.movie"]
picker.delegate = self
present(picker, animated: true)
  1. 获取视频时长:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:26:25