Audio 调用finishWritingWithCompletionHandler时,AVAssetWriter失败
我正在使用AVAssetWriter/Avassetrader将PCM音频文件转码到AAC。我把它归结为一个简单的项目,它在iOS6中工作,在iOS7中失败 一切都进展顺利,直到我到达[self.assetWriter finishWritingWithCompletionHandler:],然后assetWriter进入失败状态,错误设置为-11800 AVFoundation unknown error,内部错误设置为-12733,这显然与SampleBufferNotReady相对应Audio 调用finishWritingWithCompletionHandler时,AVAssetWriter失败,audio,encoding,avfoundation,ios7,Audio,Encoding,Avfoundation,Ios7,我正在使用AVAssetWriter/Avassetrader将PCM音频文件转码到AAC。我把它归结为一个简单的项目,它在iOS6中工作,在iOS7中失败 一切都进展顺利,直到我到达[self.assetWriter finishWritingWithCompletionHandler:],然后assetWriter进入失败状态,错误设置为-11800 AVFoundation unknown error,内部错误设置为-12733,这显然与SampleBufferNotReady相对应 di
dispatch_queue_t queue = dispatch_queue_create("audio.encode", DISPATCH_QUEUE_SERIAL);
success = [self.assetWriter startWriting];
if (!success)
{
[self showStatus:@"Export: writer failed to startWriting"];
return;
}
[self.assetWriter startSessionAtSourceTime:kCMTimeZero];
[assetWriterInput requestMediaDataWhenReadyOnQueue:queue
usingBlock:
^{
while([assetWriterInput isReadyForMoreMediaData])
{
NSAssert (self.assetWriter.status == AVAssetWriterStatusWriting, nil);
CMSampleBufferRef sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
if (sampleBuffer)
{
NSAssert (CMSampleBufferIsValid(sampleBuffer), nil);
NSAssert (CMSampleBufferDataIsReady(sampleBuffer), nil);
BOOL success = [assetWriterInput appendSampleBuffer:sampleBuffer];
if (!success)
{
[self showError:self.assetWriter.error];
self.assetWriter = nil;
CFRelease(sampleBuffer);
return;
}
CFRelease(sampleBuffer);
}
else
{
if ([assetReader status] == AVAssetReaderStatusCompleted)
{
[assetWriterInput markAsFinished];
[self.assetWriter finishWritingWithCompletionHandler:^{
BOOL success = self.assetWriter.status == AVAssetWriterStatusCompleted;
if (success)
{
[self showStatus: @"Did it!"];
self.assetWriter = nil;
}
else
{
[self showError:self.assetWriter.error];
self.assetWriter = nil;
}
}];
}
else
{
[self showError:assetReader.error];
self.assetWriter = nil;
}
}
}
}
])
注意:我已经发布了一个苹果的bug,发布到开发论坛,并使用了TSI。还没有任何答案。我希望你们中的一位天才能给我指出一个解决办法。我和你们有同样的问题,但最终我解决了这个问题,我使用以下方法:
CMTime cmTime = CMTimeMake(longDuration, 1);
[assetWriter endSessionAtSourceTime:cmTime];
[assetWriter finishWritingWithCompletionHandler^(){
NSLog (@"finished writing");
];
如果我们调用finishWritingWithCompletionHandler,通常不需要调用它;
我希望这能解决您的问题。感谢您分享您的解决方案。不幸的是,这个问题对我不起作用。我知道这个问题已经有很长一段时间没有出现了,但我最终还是遇到了同样的问题。你能解决或回避这个问题吗?