为什么一个方法工作得很好,但如果我把它放在 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那个线程。
我有这个相机应用程序。
我从相机拍摄图像,用滤镜处理它,然后在内部的某个点 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那个线程。