AVAssetExportSession 无法创建文件错误 -12115

Posted

技术标签:

【中文标题】AVAssetExportSession 无法创建文件错误 -12115【英文标题】:AVAssetExportSession Cannot create file Error -12115 【发布时间】:2016-02-28 17:57:24 【问题描述】:

由于某种原因,我总是收到此错误:

错误域=NSURLErrorDomain 代码=-3000 "无法创建文件" UserInfo=NSLocalizedDescription=无法创建文件, NSUnderlyingError=0x1321dd730 错误域=NSOSStatusErrorDomain 代码=-12115 "(null)"

尝试将 AVSession 导出到 m4a 时。这在我的同事设备上运行良好,但在我的 iPad Air 2 (ios 9.1) 以及我们的 QA iPad Mini 3 上每次都失败。

- (void)processSourceVideoFile:(NSURL *)mediaURL completion:(void (^)(BOOL success))completion 
    [self showProgressOverlay];

    NSString *outputFileType = AVFileTypeMPEG4;

    __block NSString *videoID = nil;
    if (self.videoAttachment == nil) 
        [MagicalRecord saveUsingEditContextWithBlockAndWait:^(NSManagedObjectContext *localContext) 
            self.videoAttachment = [SPXAttachment MR_createEntityInContext:localContext];
            self.videoAttachment.uuid = [NSString uuid];
            self.videoAttachment.clientCreatedAt = [NSDate date];
            videoID = self.videoAttachment.uuid;
        ];
     else 
        videoID = self.videoAttachment.uuid;
    

    self.videoAttachment = [SPXAttachment MR_findFirstByAttribute:@"uuid" withValue:videoID];

    NSString *targetPath = self.videoAttachment.filePath;
    DDLogVerbose(@"Exporting Video to %@", targetPath);
    if ([[NSFileManager defaultManager] fileExistsAtPath:targetPath]) 
        [[NSFileManager defaultManager] removeItemAtPath:targetPath error:nil];
    

    AVAsset *video = [AVAsset assetWithURL:mediaURL];

    self.exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPreset640x480];
    self.exportSession.outputFileType = outputFileType;
    self.exportSession.outputURL = [NSURL fileURLWithPath:targetPath];

    [self.exportSession exportAsynchronouslyWithCompletionHandler:^

        dispatch_async(dispatch_get_main_queue(), ^
            [self hideProgressOverlay];
        );

        switch (self.exportSession.status) 
            case AVAssetExportSessionStatusFailed:
                DDLogError(@"Video Export Failed: %@", self.exportSession.error);
                completion(NO);
                break;
            case AVAssetExportSessionStatusCancelled:
                DDLogVerbose(@"Video Export Cancelled");
                break;
            case AVAssetExportSessionStatusCompleted: 
                DDLogVerbose(@"Video Export Complete for %@", targetPath);
                BOOL dir;
                if ([[NSFileManager defaultManager] fileExistsAtPath:targetPath isDirectory:&dir]) 
                    DDLogVerbose(@"FILE IS THERE MOFO!!");
                
                completion(YES);
            
                break;
            default:
                break;
        
    ];

来源网址:file:///private/var/mobile/Containers/Data/Application/BD85BA54-5B3D-4533-A142-C2A30F373814/tmp/capture-T0x12fe1e8e0.tmp.CbksL4/capturedvideo.MOV

输出网址:file:///var/mobile/Containers/Data/Application/BD85BA54-5B3D-4533-A142-C2A30F373814/Library/Files/59124681-ba1a-4453-8078-9ca6ac3088bf/attachments/454dd782-6b14 -44cd-9f4e-84664908388b

我尝试将文件扩展名 (.mp4) 添加到输出 URL,但没有帮助。我四处搜寻与这种情况完全匹配的东西。

任何帮助表示赞赏!

【问题讨论】:

你解决了吗? 确保您的输出 URL 具有 .mp4 文件扩展名。 在 Mac 上,请确保您有权写入文件,例如 via(沙盒可能不允许写入访问): BOOL isWritable = [[NSFileManager defaultManager] isWritableFileAtPath:outputURL.path]; NSLog(@"可写: %@",@(isWritable)); 【参考方案1】:

文件名中的日期可能带有正斜杠。 正斜杠适用于目录名称,但不适用于 AVAssetExportSession 中的文件名。

【讨论】:

【参考方案2】:

确保您的输出 URL 的路径末尾有 .mp4 文件扩展名。

【讨论】:

以上是关于AVAssetExportSession 无法创建文件错误 -12115的主要内容,如果未能解决你的问题,请参考以下文章

AVAssetExportSession 总是无法导出

无法使用 AVAssetExportSession 导出 AVMutableComposition

无法使用 AVAssetExportSession 修剪音频文件

AVAssetExportSession AVFoundationErrorDomain Code -11800 操作无法完成,NSOSStatusErrorDomain Code=-12780 &q

AVAssetExportSession 和淡入淡出效果

AVAssetExportSession 错误 -11820