首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dispatch_async in captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer,样本缓冲区上的EXC_BAD_ACCESS错误

Dispatch_async in captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer,样本缓冲区上的EXC_BAD_ACCESS错误
EN

Stack Overflow用户
提问于 2021-11-26 17:16:54
回答 1查看 100关注 0票数 1

我试图从captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer获取示例缓冲区,对其进行处理,然后将其附加到AVAssetWriter中。整个代码可以工作,但是它会变得非常慢,而且我在旧设备上会得到较低的fps。

为了提高性能,我想把它放在dispatch_async中,但是,一旦访问了示例缓冲区,就会导致EXC_BAD_ACCESS错误。

如何在保持代码处于后台的情况下修复它?

代码语言:javascript
复制
queue1 = dispatch_queue_create("testqueue", DISPATCH_QUEUE_SERIAL);
...

-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection{
    
dispatch_async(queue1, ^{
...
if(captureOutput == videoOutput){
//I process the buffer by appending an image to an adaptor
if([writerVideoInput isReadyForMoreMediaData] && recordingAssetWriter.status == 1)
    [adaptor appendPixelBuffer:pxBuffer withPresentationTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)]) //<-- here I get EXC_BAD_ACCESS
}
if(captureOutput == audioOutput){
...
// I then append the audio buffer
if([assetWriterAudioInput isReadyForMoreMediaData] && recordingAssetWriter.status == 1)
    [assetWriterAudioInput appendSampleBuffer:sampleBuffer];
...
}
});

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 18:06:08

来自captureOutput:didOutputSampleBuffer:fromConnection:AVCaptureVideoDataOutput.h头文件中的讨论:

需要在此方法范围之外引用CMSampleBuffer对象的CMSampleBuffer客户端必须对其进行CFRetain,然后在完成该方法时对其进行CFRelease

所以看起来你需要保留那些样本缓冲区,因为它们超出了范围!不要忘记稍后释放它们,否则会泄漏大量内存。

我忘记了objects中的ARC不管理CoreFoundation对象。

然后,头文件将继续警告不要将示例缓冲区保留太长时间,以免丢失帧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70127955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档