AVAssetWriter/AVAssetReader を使用して、PCM オーディオ ファイルを AAC にトランスコードしています。iOS6 で動作し、iOS7 で失敗する単純なプロジェクトに煮詰めました。
[self.assetWriter finishWritingWithCompletionHandler:] に到達するまで、すべてが順調に進んでいます。次に、assetWriter が失敗状態になり、エラーが -11800 AVFoundation の不明なエラーに設定され、内部エラーが -12733 に設定されます。これは、明らかに SampleBufferNotReady に対応します。
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;
}
}
}
}
];
注: 私は Apple にバグを投稿し、dev フォーラムに投稿し、TSI を使用しました。まだ答えがありません。私の希望は、あなたの天才の 1 人が私に回避策を教えてくれることです。