为什么一个方法可以正常运行但是如果我把它放在dispatch_async中会崩溃?

时间:2017-04-10 18:51:12

标签: ios iphone avfoundation avassetwriter

我有这个相机应用程序。

我从相机中取出图像,使用过滤器对其进行处理,并在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:]状态为0时无法调用方法'

有关于此的问题。我没有成功地尝试了所有建议。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

错误“状态为0时无法调用方法”听起来好像没有正确初始化 - 请记住,当您使用dispatch_async时,您正在另一个线程上运行,因此您需要在该线程上初始化您的AVAssetWriter。