ffmpeg学习日记21-缓存AVPacket数据
avpacket中存储的是压缩过后的数据,数据量并不是很大,在合成视频之前,需要将该部分数据存在内存中,待合成使用。
创建一个存储器
std::list<AVPacket *> deque;
av_read_frame函数读出来avpacket,此处可以将avpacket结构中的数据单独存起来,也可以将整个avpacket结构存储起来,我选择后者的实现方式
while (av_read_frame(&(*ctx->fmt_ctx), &(*ctx->pkt)) >= 0) {
dec_total_frame_while++;
if (ctx->pkt->stream_index == ctx->stream_idx && ctx->codec_ctx->codec->type == AVMEDIA_TYPE_VIDEO) {
AVPacket *zctx = av_packet_alloc();
if (av_packet_ref(zctx, ctx->pkt) < 0) {
LOG_CRIT << "av_packet_ref has err!";
exit(0);
}
deque.push_back(zctx);
...
av_packet_ref函数是将pkt结构复制一份,重点,并且申请了内存
使用之后,需要进行内存释放
std::list<AVPacket *>::iterator itertmp;
for (itertmp = deque.begin(); itertmp != deque.end(); itertmp++) {
av_packet_unref(*itertmp);
av_packet_free(&(*itertmp));
}
deque.clear();
在创建存储器的时候,需要注意,创建方式为
std::list<AVPacket *> deque;
不能是
std::list<AVPacket > deque;
这种方式,在释放内存的时候,申请的内存并没有被释放掉,会造成内存泄露。