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

设置UIImagePickerController视频时长后,如何获取修剪后的视频?

如何获取UIImagePickerController修剪后的视频

嘿,我来帮你搞定这个问题!你遇到的情况其实是系统的正常设计:当开启allowsEditing并设置videoMaximumDuration后,系统不会修改相册里的原始PHAsset(毕竟不能随便改动用户的原始资源),而是会生成一个修剪后的临时视频文件,把它的路径存在回调info字典的**UIImagePickerControllerMediaURL**这个key里。

问题原因分析

你提供的info日志里没显示这个key,大概率是之前没关注到它。只要用户完成了视频修剪操作,这个key就会出现在回调的字典中,指向系统临时目录里的修剪后视频文件;而UIImagePickerControllerPHAsset始终对应相册里的原始视频,这是合理的设计逻辑。

解决方案:在代理方法中获取修剪后的视频

修改你的imagePickerController:didFinishPickingMediaWithInfo:代理方法,优先检查UIImagePickerControllerMediaURL,具体代码示例如下:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    // 先关闭选择器
    [picker dismissViewControllerAnimated:YES completion:nil];
    
    // 判断当前选择的是视频类型
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
        // 1. 优先获取修剪后的临时视频URL
        NSURL *trimmedVideoURL = info[UIImagePickerControllerMediaURL];
        if (trimmedVideoURL) {
            NSLog(@"修剪后的视频临时路径: %@", trimmedVideoURL);
            
            // 重要提示:临时文件会被系统自动清理,如需长期保存请复制到沙盒目录
            NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
            NSString *saveFilePath = [documentsDir stringByAppendingPathComponent:@"my_trimmed_video.mov"];
            NSFileManager *fileManager = [NSFileManager defaultManager];
            
            // 先删除已存在的同名文件
            if ([fileManager fileExistsAtPath:saveFilePath]) {
                [fileManager removeItemAtPath:saveFilePath error:nil];
            }
            
            // 复制临时文件到自定义目录
            NSError *error;
            BOOL copySuccess = [fileManager copyItemAtURL:trimmedVideoURL toURL:[NSURL fileURLWithPath:saveFilePath] error:&error];
            if (copySuccess) {
                NSLog(@"修剪后的视频已保存到: %@", saveFilePath);
                // 这里可以基于保存后的路径做后续业务处理
            } else {
                NSLog(@"保存修剪视频失败: %@", error.localizedDescription);
            }
        } else {
            // 2. 如果没有修剪操作(或修剪失败),再处理原始PHAsset
            PHAsset *originalAsset = info[UIImagePickerControllerPHAsset];
            if (originalAsset) {
                NSLog(@"获取原始视频PHAsset: %@", originalAsset);
                // 这里编写处理原始视频的逻辑
            }
        }
    }
}

额外注意事项

  • 临时文件生命周期:UIImagePickerControllerMediaURL指向的文件是系统临时文件,当APP退到后台或被系统回收时,该文件可能被自动删除,所以务必及时复制到沙盒的持久化目录(比如Documents)。
  • 权限验证:确保你的APP已经申请了相册访问权限和文件读写权限,否则可能无法读取临时文件或完成保存操作。

内容的提问来源于stack exchange,提问作者s0rana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:21:38