我已将 ffmpeg 整合到一个 iPad 应用程序中,当我通过 rtsp 流式传输时,我看到应用程序在流式传输几个小时后崩溃。
当我通过 Instruments/leaks 调试应用程序时,我发现有问题的泄漏在 FFMPEG 库中,并且有问题的函数是 av_buffer_realloc。
有谁知道我该如何着手解决/修复此漏洞?我没有很多工具可供使用,而且我什至不确定发帖到哪里才能解决这个问题?
感谢您的任何帮助/建议。
根据要求,这是代码。但是,它与我的代码无关,因为流式传输正在发生,FFMPEG 中存在泄漏。无论我将计时器设置为 1/30 秒还是 1/60 秒,泄漏都是一致的,并且如上所述是在一个不是我的例程中 - 它在 ffmpeg 库中。
video = [[RTSPPlayer alloc] initWithVideo:szURL usesTcp:NO];
lastFrameTime = -1;
// seek to 0.0 seconds
[video seekTime:0.0];
[_nextFrameTimer invalidate];
self.nextFrameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30 target:self selector:@selector(displayNextFrame:) userInfo:nil repeats:YES];
这里是 displayNextFrame。它调用 RSTPPlayer 获取快照视频帧:
{
if (![video stepFrame]) {
[timer invalidate];
[video closeAudio];
return;
}
self.theImageView.image = video.currentImage;
}
这是来自 RTSPPlayer 的 currentImage 代码:
- (UIImage *)currentImage
{
if (!pFrame->data[0]) return nil;
[self convertFrameToRGB];
return [self imageFromAVPicture:picture width:outputWidth height:outputHeight];
}
这是 imageFromAVPicture:
- (UIImage *)imageFromAVPicture:(AVPicture)pict width:(int)width height:(int)height
{
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pict.data[0], pict.linesize[0]*height,kCFAllocatorNull);
CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef cgImage = CGImageCreate(width,
height,
8,
24,
pict.linesize[0],
colorSpace,
bitmapInfo,
provider,
NULL,
NO,
kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGDataProviderRelease(provider);
CFRelease(data);
return image;
感谢您的帮助。
最佳答案
在 - (BOOL)stepFrame 函数中,添加
av_free_packet(&packet);
下面
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
关于ios - ffmpeg中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383558/