我正在使用AVAssetWriter,它完全适用于iOS6。
问题是,当我调用finishWritingWithCompletionHandler
时,不会在iOS7 GM上调用完成处理程序。
在调用finishWritingWithCompletionHandler之前,我调用了markAsFinished
,甚至是endSessionAtSourceTime
。
在iOS6上运行正常。
更重要的是,在iOS7上,它可以运行一段时间,然后它再次无效。
我不知道为什么,但如果我使用警报视图调用该方法,它就有效。
所以我尝试了performSelectorOnMainThread
和inBackground
,但没有帮助。
有什么想法吗?
答案 0 :(得分:38)
显然你现在需要保留assetWriter。
您可以尝试保留强大的属性,并查看是否调用了完成处理程序。 (确保在完成处理程序中将该属性设为nil。)
答案 1 :(得分:8)
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)
如果目标目录不存在,也会发生这种情况。 在这种情况下,写入工作正常,但没有创建文件,也没有调用块。