我正在使用VTDecompressionSession解码.h264流。解码器按预期工作,我得到正确解码的缓冲区。但是,我看到XCode工具“分配”中的“创建且持久”分配逐渐增加。如屏幕截图所示,这些可以归因于解码器在内部分配的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);
我正在使用VTDecompressionSession解码.h264流。解码器按预期工作,我得到正确解码的缓冲区。但是,我看到“创建且持久”的数量逐渐增加...
这不正常,您的代码中肯定存在泄漏。