2012-03-29 107 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功能,沒有清理髮生!