audio - 调用 finishWritingWithCompletionHandler 时 AVAssetWriter 失败

标签 audio encoding avfoundation ios7

我正在使用 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 的错误,发布到开发论坛并使用了 TSI。还没有得到任何答案。我希望你们中的一位天才能为我指出一个解决方法。

最佳答案

我和你有同样的问题,但最后我解决了那个问题,我用这个方法:

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

如果我们调用finishWritingWithCompletionHandler,通常我们不需要调用它; 我希望这能解决您的问题。

关于audio - 调用 finishWritingWithCompletionHandler 时 AVAssetWriter 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18885735/

相关文章:

使用 Amazon 服务进行 Java Base64 编码

php - 带有外国口音字符的 Apple 推送通知未收到

ios - AVFoundation 没有长视频的音轨

java - Clip 可以播放多长的文件?

android - PCM Raw Bytes [] 到 Android 上的音频

php - 从 cp1255 到 UTF-8 的编码转换

ios - 将 NSData 视频文件合并为一个视频文件

html - 在https://modernizr.com/download上找不到Modernizr.load()或HTML5音频

c# - 如何使用MediaPlayer C#停止声音

ios - AV播放器 : Fade in audio of a video