私はlibavcodecの助けを借りてビデオをコード変換しようとしています。 大きなビデオファイルを(1時間以上)トランスコードすると、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;
}