ios - ffmpeg中的内存泄漏

标签 ios memory-leaks ffmpeg

我已将 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);

引用:Github issues

关于ios - ffmpeg中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383558/

相关文章:

ios - 为什么要使用 registerDefaults : instead of setValue:forKey:?

ios - 有什么比 for 循环更好的方法来实现涉及集合的算法?

ios - ARC , stringWithUTF8String 内存稳步增加 “Live Bytes”

ffmpeg 如何使定时图片叠加更改重复

ios - iOS 上的 SSL 固定

c++ - LeakSanitizer 和泄漏库

Python不在for循环中释放内存

video - FFMPEG:将 mkv 和 mka 合并到 mp4 会减慢 mp4 输出

ruby-on-rails - 使用 Rails/Paperclip 上传视频到 Heroku/S3

ios - 如何在 Swift 2 中将结构转换为 Anyobject?