AVPacket相关函数介绍
转载: https://www.jianshu.com/p/bb6d3905907e
操作AVPacket的函数大约有30个,主要分为:AVPacket的创建初始化,AVPacket中的data数据管理(clone,free,copy),AVPacket中的side_data数据管理。 void av_init_packet(AVPacket *pkt); 初始化packet的值为默认值,该函数不会影响data引用的数据缓存空间和size,需要单独处理。 int av_new_packet(AVPacket *pkt, int size); av_init_packet的增强版,不但会初始化字段,还为data分配了存储空间 AVPacket *av_packet_alloc(void); 创建一个AVPacket,将其字段设为默认值(data为空,没有数据缓存空间)。 void av_packet_free(AVPacket **pkt); 释放使用av_packet_alloc创建的AVPacket,如果该Packet有引用计数(packet->buf不为空),则先调用av_packet_unref。 AVPacket *av_packet_clone(const AVPacket *src); 其功能是av_packet_alloc和av_packet_ref int av_copy_packet(AVPacket *dst, const AVPacket *src); 复制一个新的packet,包括数据缓存 int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); 初始化一个引用计数的packet,并指定了其数据缓存 int av_grow_packet(AVPacket *pkt, int grow_by); 增大Packet->data指向的数据缓存 void av_shrink_packet(AVPacket *pkt, int size); 减小Packet->data指向的数据缓存 3.1 废弃函数介绍 ------> av_dup_packet和av_free_packet int av_dup_packet(AVPacket *pkt); 复制src->data引用的数据缓存,赋值给dst。也就是创建两个独立packet,这个功能现在可用使用函数av_packet_ref来代替 void av_free_packet(AVPacket *pkt); 释放packet,包括其data引用的数据缓存,现在可以使用av_packet_unref代替 3.2 函数对比 --------->av_free_packet和av_packet_free void av_free_packet(AVPacket *pkt); 只是清空里边的数据内容,内存地址仍然在。我的版本是3.3已经废弃,所以用av_packet_unref替代。 如果不清空会发生什么情况呢,举个简单的例子,一个char数组大小为128,里面有100个自己的内容。第二次使用你没有清空第一次的内容,第二次的数据大小为60,那么第一次的最后40个字节的数据仍会保留,造成数据冗余,极大可能对你的处理造成影响(这个跟自己的处理有关系,并不一定)。 void av_packet_free(AVPacket **pkt); 类似于free(p); p = Null;不仅清空内容还清空内存(一般就是如果用了av_packet_alloc后就要调用av_packet_free来释放。但如果有引用计数,在调用av_packet_free前一般先调用av_packet_unref) 作者:片片碎 链接:https://www.jianshu.com/p/bb6d3905907e 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。