我试图从captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer获取示例缓冲区,对其进行处理,然后将其附加到AVAssetWriter中。整个代码可以工作,但是它会变得非常慢,而且我在旧设备上会得到较低的fps。
为了提高性能,我想把它放在dispatch_async中,但是,一旦访问了示例缓冲区,就会导致EXC_BAD_ACCESS错误。
如何在保持代码处于后台的情况下修复它?
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];
...
}
});
}发布于 2021-11-26 18:06:08
来自captureOutput:didOutputSampleBuffer:fromConnection:在AVCaptureVideoDataOutput.h头文件中的讨论:
需要在此方法范围之外引用CMSampleBuffer对象的CMSampleBuffer客户端必须对其进行CFRetain,然后在完成该方法时对其进行CFRelease。
所以看起来你需要保留那些样本缓冲区,因为它们超出了范围!不要忘记稍后释放它们,否则会泄漏大量内存。
我忘记了objects中的ARC不管理CoreFoundation对象。
然后,头文件将继续警告不要将示例缓冲区保留太长时间,以免丢失帧。
https://stackoverflow.com/questions/70127955
复制相似问题