在iOS7 GM上不调用完成处理程序

时间:2013-09-14 12:56:11

标签: ios7 avassetwriter completionhandler

我正在使用AVAssetWriter,它完全适用于iOS6。

问题是,当我调用finishWritingWithCompletionHandler时,不会在iOS7 GM上调用完成处理程序。

在调用finishWritingWithCompletionHandler之前,我调用了markAsFinished,甚至是endSessionAtSourceTime

在iOS6上运行正常。

更重要的是,在iOS7上,它可以运行一段时间,然后它再次无效。

我不知道为什么,但如果我使用警报视图调用该方法,它就有效。 所以我尝试了performSelectorOnMainThreadinBackground,但没有帮助。

有什么想法吗?

5 个答案:

答案 0 :(得分:38)

显然你现在需要保留assetWriter。

您可以尝试保留强大的属性,并查看是否调用了完成处理程序。 (确保在完成处理程序中将该属性设为nil。)

答案 1 :(得分:8)

Ray Fix,你是对的。我们需要保留assetWriter。最简单的方法是在finishWritingWithCompletionHandler块中使用它:

        NSError *error = nil;

        AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]
                                                                   fileType:AVFileType3GPP
                                                                      error:&error];
        //startWriting, session etc.  

        [videoWriter finishWritingWithCompletionHandler:^{
                NSLog(@"%@",videoWriter);
                NSLog(@"Write Ended");
            }];

答案 2 :(得分:3)

保留资产撰写人是非常重要的,但即使我的资产撰写人都被保留(并且从未重复使用),我也遇到了一个非常奇怪的间歇性失败。问题还在于文件名冲突或缺少目录,因为我的文件名都是基于CACurrentMediaTime()而不是更改目录。

似乎每次都没有为资产撰稿人设置endSessionAtSourceTime:finishWritingWithCompletionHandler:的完成处理程序赢得了很少(但可重现)的机会永远被称为。如果您等待几秒钟并检查资产编写者的状态,它将处于AVAssetWriterStatusFailure状态,并且错误将是非描述性的"发生未知错误(-12763)"。此外,更改资产编写者的文件格式并不会对此问题产生影响。最后,如果您需要一遍又一遍地快速录制电影,这个问题可能只是个问题(因为失败的可能性大概是1/15 - 1/20)。

因此,请务必将最后一个样本的演示文稿时间戳存储到资产管理员手中,并在您即将致电{之前'用该样本时间调用endSessionAtSourceTime: {1}}。

答案 3 :(得分:3)

这也发生在ARC上。

最简单的解决方案是定义AVAssetWriter的属性(以及我假设的AVAssetReader)

@property(nonatomic,strong) AVAssetWriter *assetWriter;
@property(nonatomic,strong) AVAssetReader *assetReader;

然后

self.assetWriter = [AVAssetWriter assetWriterWithURL:destURL
                                                       fileType:AVFileTypeWAVE
                                                          error:&assetError];

并在完成块中

              [assetWriterInput markAsFinished];
             [assetWriter finishWritingWithCompletionHandler:^{
                 [assetReader cancelReading];
                 completionBlock(self);

             }];

答案 4 :(得分:1)

如果目标目录不存在,也会发生这种情况。 在这种情况下,写入工作正常,但没有创建文件,也没有调用块。