我正在使用 VTDecompressionSession 来解码 .h264 流。解码器按预期工作,我得到正确解码的缓冲区。但是,我看到 XCode 工具“Allocations”中的“Created And Persistent”分配逐渐增加。如屏幕截图所示,这些可以归因于解码器内部分配的 IOSurface 缓冲区,即使在 VTDecompressionSession 释放后这些缓冲区也不会被释放。我在同步解码和异步回调 decompressionSessionDecodeFrameCallback 中都看到了这些情况。剩余的帧数在发生和时间上是随机的。这些缓冲区的大小正好等于解码帧的大小。在使解码器会话无效之前,我确实调用了 VTDecompressionSessionWaitForAsynchronousFrames,但这些分配不会消失。有没有办法在解码器会话结束时释放这些 IOSurface 缓冲区?
这是我的解码器运行的大纲。创建解码器会话
const void *values[] = { CFNumberCreate(NULL, kCFNumberSInt32Type, &v) };
attrs = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
VTDecompressionOutputCallbackRecord callBackRecord;
callBackRecord.decompressionOutputCallback = decompressionSessionDecodeFrameCallback;
callBackRecord.decompressionOutputRefCon = (__bridge void *)self;
VTDecompressionSessionCreate(kCFAllocatorDefault,
_decoderFormatDescription,
NULL,
attrs,
&callBackRecord,
&_decoderSession);
当 NALU 数据包准备好时调用进行解码
CMSampleBufferRef sampleBuffer = nil;
const size_t sampleSizeArray[] = {packetLen};
CMSampleTimingInfo sampleTimeinfo ={CMTimeMake(1,FPS), CMTimeMake(presentationTS, 1000000), kCMTimeInvalid};
CMSampleBufferCreateReady(kCFAllocatorDefault, blockBuffer, _decoderFormatDescription ,
1, 1, &sampleTimeinfo, 1, sampleSizeArray, &sampleBuffer);
flags = kVTDecodeFrame_EnableAsynchronousDecompression;
VTDecompressionSessionDecodeFrame(_decoderSession,
sampleBuffer,
flags,
&sampleBuffer,
&flagOut);
打回来
void decompressionSessionDecodeFrameCallback{
CVPixelBufferLockBaseAddress(imageBuffer,0);
....
send to display
....
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}
结束解码器会话
VTDecompressionSessionWaitForAsynchronousFrames(_decoderSession);
VTDecompressionSessionInvalidate(_decoderSession);
CFRelease(_decoderSession);