Я пытаюсь перекодировать видео с помощью libavcodec.
При перекодировании больших видеофайлов (час или больше) я получаю огромные утечки памяти в avcodec_encode_video. Я попытался отладить его, но с разными видеофайлами разные функции приводят к утечкам, я немного запутался по этому поводу :). Здесь FFMPEG с утечкой памяти QT - это та же проблема, что и у меня, но я понятия не имею, как этот человек решил ее. QtFFmpegwrapper, кажется, делает то же самое, что и я (или я что-то пропустил).
мой метод ниже. Я позаботился об aFrame и aPacket снаружи с помощью av_free и av_free_packet.
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;
}