我有这个相机应用程序。
我从相机中取出图像,使用过滤器对其进行处理,并在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时无法调用方法'
有关于此的问题。我没有成功地尝试了所有建议。
有什么想法吗?
答案 0 :(得分:1)
错误“状态为0时无法调用方法”听起来好像没有正确初始化 - 请记住,当您使用dispatch_async时,您正在另一个线程上运行,因此您需要在该线程上初始化您的AVAssetWriter。