设置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
相关产品推荐
相关产品推荐

