3

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 人が私に回避策を教えてくれることです。

4

1 に答える 1

5

私はあなたと同じ問題を抱えていますが、最終的にその問題を解決します。私はこの方法を使用します:

CMTime cmTime = CMTimeMake(longDuration, 1);
[assetWriter endSessionAtSourceTime:cmTime];
[assetWriter finishWritingWithCompletionHandler^(){
    NSLog (@"finished writing");
];

通常、finishWritingWithCompletionHandler を呼び出す場合は、これを呼び出す必要はありません。これで問題が解決することを願っています。

于 2013-10-09T10:11:44.160 に答える