2012-03-29 53 views
0

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

我的方法较低。我在外面使用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; 
} 

回答

0

第一步是尝试重现您的问题Valgrind的下一个Linux中,如果你能。

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->destruct功能,没有清理发生!