FFmpeg -- 02-音频包队列AVPacket的api使用
音频队列解析过程
·
AVPacket常用API:
AVPacket *av_packet_alloc(void); //分配AVPacket
int av_new_packet(AVPacket *pkt, int size); // 给AVPacket的buf分配内存, 引用计数初始化为1
int av_packet_ref(AVPacket *dst, const AVPacket *src);
// 引用计数+1
void av_packet_move_ref(AVPacket *dst, AVPacket *src); // 转移引用计数
void av_packet_unref(AVPacket *pkt); // 引用计数-1
void av_frame_free(AVFrame ** frame); // 释放AVFrame
, 内部已调用av_packet_unref 函数
代码分析:
- int av_new_packet(AVPacket *pkt, int size);
如果该Packet有引用计数(packet->buf不为空),则先调用av_packet_unref(&packet),只有当引用计数为0时,才会在调用av_packet_free()时释放data的缓存
AVPacket *pkt = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE); // 引用计数初始化为1
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
av_packet_unref(pkt);
av_packet_free(&pkt);
- void av_packet_move_ref(AVPacket *dst, AVPacket *src);
把src整个结构体直接赋值给dst,所以引用计数没有发生变化,并且src被av_init_packet重置
AVPacket *pkt = NULL;
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_alloc(); // 必须先alloc
av_packet_move_ref(pkt2, pkt);//内部其实也调用了av_init_packet
av_packet_free(&pkt);
av_packet_free(&pkt2);
- AVPacket *av_packet_clone(const AVPacket *src);
其功能是 av_packet_alloc() + av_packet_ref();
AVPacket *pkt = NULL;
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_clone(pkt);
av_packet_free(&pkt);
av_packet_free(&pkt2);
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)