为什么一个方法工作得很好,但如果我把它放在 dispatch_async 中就会崩溃?

Why a method works perfectly but crashes if I put it inside a dispatch_async?

我有这个相机应用程序。

我从相机拍摄图像,用滤镜处理它,然后在内部的某个点 captureOutput:didOutputSampleBuffer:fromConnection: 我拍摄最终图像并使用以下方法将其写入文件:

    CFRetain(sampleBuffer);
    [myself writeToVideoImage:resultadoFinal
             withSampleBuffer:sampleBuffer];
     CFRelease(sampleBuffer);

效果很好,但如果我把它放在一个队列中,就像这样:

    CFRetain(sampleBuffer);        
    dispatch_async(_writeToVideoQueue, ^{
      [myself writeToVideoImage:resultadoFinal 
               withSampleBuffer:sampleBuffer];
      CFRelease(sampleBuffer);
    });

在线崩溃

[_assetWriter startSessionAtSourceTime:presentationTime];

- (void)writeToVideoImage:(CIImage *)resultadoFinal
         withSampleBuffer:(CMSampleBufferRef)sampleBuffer
{

  CFRetain(sampleBuffer);
  CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);

  CGRect extent = [resultadoFinal extent];

  if (!_readyToWriteVideo) {
    _readyToWriteVideo = [self setupAssetWriterVideoInputWithSize:extent.size];
    return;
  }
  else if (_videoWritingStarted) {
    _videoWritingStarted = NO;
    // ***** CRASHES HERE ************
    [_assetWriter startSessionAtSourceTime:presentationTime]; 
  }


  CVPixelBufferRef renderedOutputPixelBuffer = NULL;

  OSStatus err = CVPixelBufferPoolCreatePixelBuffer(NULL,
                                                    _pixelBufferAdaptor.pixelBufferPool,
                                                    &renderedOutputPixelBuffer);
  if (err) return;

  [_ciContext render:resultadoFinal
     toCVPixelBuffer:renderedOutputPixelBuffer
              bounds:extent
          colorSpace:_sDeviceRgbColorSpace];

  [self writeToFile:renderedOutputPixelBuffer
      comSampleTime:presentationTime
               size:extent.size];
  CFRelease(renderedOutputPixelBuffer);
  CFRelease(sampleBuffer);
}

我不知道发生了什么。

这似乎是在解除分配。我首先怀疑 sampleBuffer 正在取消分配,但我将它保留在函数内部和外部,以防万一。在调用该方法之前,我还尝试在块内创建 resultadoFinal 的副本,但没有成功。

Xcode显示错误

[AVAssetWriter startSessionAtSourceTime:] Cannot call method when status is 0'

SO 上有关于此的问题。我已经尝试了所有的建议,但都没有成功。

有什么想法吗?

错误 "Cannot call method when status is 0" 听起来好像有些东西没有正确初始化 - 请记住,当您使用 dispatch_async 时,您是 运行 在不同的线程上,因此您需要初始化您的 AVAssetWriter那个线程。