【问题标题】:ffmpeg(libavcodec). memory leaks in avcodec_encode_videoffmpeg(libavcodec)。 avcodec_encode_video 中的内存泄漏
【发布时间】:2012-04-13 09:27:09
【问题描述】:

我正在尝试借助 libavcodec 对视频进行转码。 在对大视频文件(小时或更长时间)进行转码时,我在 avcodec_encode_video 中出现了巨大的内存泄漏。我试图调试它,但是对于不同的视频文件,不同的功能会产生泄漏,我对此有点困惑:)。这里FFMPEG with QT memory leak 与我遇到的问题相同,但我不知道那个人是如何解决的。 QtFFmpegwrapper 似乎和我做的一样(或者我错过了一些东西)。

我的方法比较低。我用 av_free 和 av_free_packet 在外面处理了 aFrame 和 aPacket。

int
Videocut::encode(
AVStream *anOutputStream,
AVFrame *aFrame,
AVPacket *aPacket
)
{
AVCodecContext *outputCodec = anOutputStream->codec;

if (!anOutputStream ||
    !aFrame ||
    !aPacket)
{
    return 1;
    /* NOTREACHED */
}

uint8_t * buffer = (uint8_t *)malloc(
    sizeof(uint8_t) * _DefaultEncodeBufferSize
    );

    if (NULL == buffer) {
        return 2;
        /* NOTREACHED */
}

int packetSize = avcodec_encode_video(
    outputCodec,
        buffer,
        _DefaultEncodeBufferSize,
        aFrame
    );

if (packetSize < 0) {
    free(buffer);
    return 1;
    /* NOTREACHED */
}

aPacket->data = buffer;
aPacket->size = packetSize;

return 0;
}

【问题讨论】:

    标签: c++ memory-leaks ffmpeg libavcodec


    【解决方案1】:

    如果可以的话,第一步是尝试在 Linux 机器上的 Valgrind 下重现您的问题。

    ffmpeg 编码器和解码器通常不会动态分配内存;他们在调用之间重用缓冲区。泄漏通常会出现在框架中的某个地方。

    请注意,av_free_packet 只会在数据包具有析构函数时释放动态分配的缓冲区!

    看看libavcodec/avpacket.c中函数是怎么定义的:

    void av_free_packet(AVPacket *pkt)
    {
        if (pkt) {
            if (pkt->destruct) pkt->destruct(pkt);
            pkt->data = NULL; pkt->size = 0;
            pkt->side_data       = NULL;
            pkt->side_data_elems = 0;
        }
    }
    

    如果没有pkt-&gt;destruct 函数,则不会进行清理!

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2013-08-04
      • 2011-05-11
      • 1970-01-01
      • 2020-06-12
      相关资源
      最近更新 更多