FFMPEG AVPacket

Posted on 2025-03-24 21:56  C27  阅读(29)  评论(0)    收藏  举报

问题:从av_read_frame中读到一个AVPacket如何放入Packet queue

AVPacket复制分两种情况,一种是深拷贝,一种是浅拷贝,主要介绍一下浅拷贝的情况

AVPacket中有一个AVBufferRef类型的指针,这个指针指向了AVBuffer,AVBuffer中有一个引用计数,用来统计有多少个AVPacket引用到这个buffer。(AVPacket引用到同一个AVBuffer,共同拥有的是AVBuffer而不是AVBufferRef)

AVPacket常用API

AVPacket* av_packet_alloc(void) 分配AVPacket,不分配AVBuffer和AVBuffer无关
void av_packet_free(AVPacket **pkt) 释放AVPacket ,其中也调用了av_packet_unref,会释放AVBuffer
void av_init_packet(AVPacket *pkt) 只初始化AVPacket字段,buffer会设置为null
int av_new_packet(AVPacket* pkt,int size) 会给AVPacket中的AVBuffer申请空间
int av_packet_ref(AVPacket *dst, const AVPacket *src) 增加引用计数,将原拷贝给目标
void av_packet_unref(AVPacket *pkt) 减少引用计数
void av_packet_move_ref(AVPacket *dst, AVPacket *src) 转移引用计数,转移会直接将dst中的AVBufferRef给到src