-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
视频导出失败 #1073
Comments
IMG_3964.mp4.zip |
@jiangyuan0336 已复现,没啥时间看... |
PR是什么? |
@jiangyuan0336 Pull Request哈,你fork TZ这个仓库,修复这个bug,再提交PR到TZ这个仓库,我验证后merge下发个版,以后大家就都可以使用你修复后的版本咯 |
同样遇到了这个问题, |
视频导出失败:视频导出失败,error:Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={NSLocalizedFailureReason=发生未知错误(-12780), NSLocalizedDescription=这项操作无法完成, NSUnderlyingError=0x28146f930 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}} 只有把presetName 变成AVAssetExportPresetLowQuality才可以 |
我打印了一下AVAssetExportPreset的枚举值,发现这个视频包含AVAssetExportPresetHigh这个类型,但是导出确实存在问题的 |
搜了一圈好像挺多人都遇到这个错误,但是都没有合适的解法... presetName设置为AVAssetExportPresetLowQuality后IMG_3964.mp4确实可以导出了,原因不明... |
如果导出压缩失败了 是不是可以直接把这个资源文件写入呢 不通过压缩 |
- (void)getVideoOutputPathWithAsset:(PHAsset *)asset presetName:(NSString *)presetName success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure {
PHVideoRequestOptions* options = [[PHVideoRequestOptions alloc] init];
options.version = PHVideoRequestOptionsVersionOriginal;
options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
options.networkAccessAllowed = YES;
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset* avasset, AVAudioMix* audioMix, NSDictionary* info){
// NSLog(@"Info:\n%@",info);
AVURLAsset *videoAsset = (AVURLAsset*)avasset;
//在处理120帧无声音视频的时候,直接崩溃,原因是AVURLAsset *videoAsset = (AVURLAsset *)asset;因为asset是个基类,它有时会是AVComposition而不是AVURLAsset,这样就得不到视频的url,从而导致程序崩溃
if ([videoAsset isKindOfClass:[AVURLAsset class]]) {
if (videoAsset.URL){
NSString *outputPath = self.outPutFile;
NSData *data = [NSData dataWithContentsOfURL:videoAsset.URL];
if (data){
[data writeToFile:outputPath atomically:YES];
success(outputPath);
}else{
failure(@"导出失败", nil);
}
}else{
failure(@"导出失败", nil);
}
}else{
failure(@"导出失败", nil);
}
}];
// [self startExportVideoWithVideoAsset:videoAsset presetName:presetName success:success failure:failure];
} |
我现在没有使用他给的指定presetName的方法 而是用的上面这个,就不会出现这样的问题了 |
|
使用这个可以成功压缩上面的两个视频 具体原理还在研究 |
我也遇到了这个问题,即使使用 @mlp1995 的方法,但是只要是某些android上传的视频,使用iOS手机保存到相册,再去压缩导出依然不行。
|
上面的方法对我无效。 我发现视频导出失败的问题是在同时选择多个视频的时候出现的,而一次只选择一个视频时就没有问题。我的解决方法是,创建一个串行队列,将导出视频并上传的异步任务放到队列中,通过信号量来控制任务的执行,保证每次只导出一个视频,上传完成后再导出下一个,就没再出现这个问题。总之,这个问题应该是同时导出多个视频导致的。 希望能帮助到有需要的人。 |
emmmmm,不一定的,目前据我遇到的情况来看,无法导出的视频都是一些其他软件(可能是从安卓)合成的视频,用苹果下载到相册,AVAssetExportSession可能就会无法导出这些视频,上面的其他方法对我来说确实没用,不过七牛的那个SDK对我这边是生效的,所以建议使用AVAssetWriter和AVAssetReader来导出这些视频,可以自己写一个或者使用第三方的。 |
@zisulu 官方推荐8Mbps,我觉得5Mbps足够 |
恩。我现在用的就是5,可以接受。 |
不知楼主当前有好的办法解决吗? |
安卓手机第三方app编辑过的视频,在苹果手机相册里可以打开,使用系统相册编辑压缩也是失败,但是微信上可以压缩,压缩后的视频可以正常使用压缩😂 |
可以使用 亲测 |
这里指定了 export 输出的格式是 640*480 目前测试出,如果原视频小于等于这个分辨率,一定会报错 |
@yehot 这个presetName可以从外面设置哈,你那边有测试出如何设置才确保成功吗? |
感觉和视频没关系,我手机相册大部分视频都会失败,一模一样的错误。 |
@charlesYun 如果你是iOS14的话,那是iCloud的就会失败:#1397 |
@banchichen 那请问应该怎么解决呢? |
@charlesYun 目前还没看到解法,这里讨论也比较多:ivpusic/react-native-image-crop-picker#1415 。可以关注一下 |
@banchichen 我换另一种导出方式,测试了一些视频暂时没有发现有失败的情况,需要的可以试试 - (void)getVideoOutputPathWithAsset:(PHAsset *)asset success:(void (^)(NSString *outputPath))success failure:(void (^)(NSString *errorMessage, NSError *error))failure {
// [self getVideoOutputPathWithAsset:asset presetName:AVAssetExportPresetMediumQuality success:success failure:failure];
// Option
PHVideoRequestOptions *option = [[PHVideoRequestOptions alloc] init];
option.version = PHVideoRequestOptionsVersionCurrent;
option.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
option.networkAccessAllowed = YES;
// Manager
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestExportSessionForVideo:asset options:option exportPreset:AVAssetExportPresetHighestQuality resultHandler:^(AVAssetExportSession *_Nullable exportSession, NSDictionary *_Nullable info) {
// Path
NSString *outputPath = [CMFileManager documentDirectoryAtPath:@"CMVideo" documentDirectoryType:CMDocumentDirectoryTypeDocuments];
outputPath = [outputPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4", [[asset valueForKey:@"filename"] stringByDeletingPathExtension]]];
if ([CMFileManager fileExistsAtPath:outputPath]) {
dispatch_async(dispatch_get_main_queue(), ^{
if (success) {
success(outputPath);
}
});
return;
}
// Export
exportSession.outputURL = [NSURL fileURLWithPath:outputPath];
exportSession.shouldOptimizeForNetworkUse = NO;
exportSession.outputFileType = AVFileTypeMPEG4;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
switch ([exportSession status]) {
case AVAssetExportSessionStatusFailed: {
if (failure) {
failure(@"视频导出失败", nil);
}
} break;
case AVAssetExportSessionStatusCompleted: {
if (success) {
success(outputPath);
}
} break;
default:
break;
}
});
}];
}];
} |
升级到3.5.3后,大家发现的会导出失败的视频,可以建一个共享相册,然后邀请我 [email protected] |
3.5.3版本修复了iOS14下iCloud视频导出失败的问题,感谢 @charlesYun 提供的方案👍 同时在 /// 得到视频原始文件地址
- (void)requestVideoURLWithAsset:(PHAsset *)asset success:(void (^)(NSURL *videoURL))success failure:(void (^)(NSDictionary* info))failure; 通过它可以读取到视频的原始地址URL,然后用文件操作的相关API可以访问视频原始数据(未经压缩),或者这样读也行: NSData *data = [NSData dataWithContentsOfURL:videoURL]; 大家若还发现视频导出失败问题,请建一个共享相册,然后邀请我 [email protected],开一个新issue(或者加群),我再来解决 |
然后3.5.3也修复了批量导出视频时,因导出路径重复导致的偶现失败 |
1. Fix fetchFullSizeVideo flow logic. Avoid keeping call fetchFullSizeVideo when progress is 1.0. This operation cause a loop. 2. Change requestAVAssetForVideo to requestExportSessionForVideo. Avoid iCloud file export failure. Ref: banchichen/TZImagePickerController#1073 3. Add modification date as file name prefix. Avoid to get the cache file if user modified it.
1. Fix fetchFullSizeVideo flow logic. Avoid keeping call fetchFullSizeVideo when progress is 1.0. This operation cause a loop. 2. Change requestAVAssetForVideo to requestExportSessionForVideo. Avoid iCloud file export failure. Ref: banchichen/TZImagePickerController#1073 3. Add modification date as file name prefix. Avoid to get the cache file if user modified it.
1. Fix fetchFullSizeVideo flow logic. Avoid keeping call fetchFullSizeVideo when progress is 1.0. This operation cause a loop. 2. Change requestAVAssetForVideo to requestExportSessionForVideo. Avoid iCloud file export failure. Ref: banchichen/TZImagePickerController#1073 3. Add modification date as file name prefix. Avoid to get the cache file if user modified it.
请问这个问题解决了吗? |
@YaoWeiCheng 参考上条回复,你的问题是? |
@gxtai 参考上面的回复哈...最新版能复现的话,把这个视频共享给我下 |
1. Fix fetchFullSizeVideo flow logic. Avoid keeping call fetchFullSizeVideo when progress is 1.0. This operation cause a loop. 2. Change requestAVAssetForVideo to requestExportSessionForVideo. Avoid iCloud file export failure. Ref: banchichen/TZImagePickerController#1073 3. Add modification date as file name prefix. Avoid to get the cache file if user modified it.
提bug前必看
请先回答下列三个问题,否则不允处理,谢谢配合。
1、我最新的Demo是否有这个bug?【如果Demo没问题,请升级新版】
答:有
2、你用的是什么版本?升级到最新版后是否正常?
答:version 3.2.0,已经是最新的
3、是否有改动过我库内部的代码?【如有,请告诉我你改了什么】
答:没有改
bug内容描述
就是相册里面有两个视频,可以选取,但是如果导出的话就出现视频导出失败,TZImagePickerController[54670:16431685] 视频导出失败:视频导出失败,error:Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={NSLocalizedFailureReason=发生未知错误(-12780), NSLocalizedDescription=这项操作无法完成, NSUnderlyingError=0x2830ea9a0 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}}
我如何复现这个bug?
我可以把视频给你
截图
其它说明
有没有其它要补充的?比如你的初始化TZImagePickerController的代码
The text was updated successfully, but these errors were encountered: