FFmpeg API 之 AVPacket

AVPacket 是 FFmpeg 中最常见的类型之一。

AVPacket类,用于存储编码后的帧数据。它一般由 demuxer 导出,然后传递给 decoder 作为输入;或者,从 encoder 作为输出,然后传递给 muxer。

对视频来说,一个 AVPacket 一般仅包含一个帧编码后的数据。对音频而言,它可能包含多个帧编码后的数据。encoder 允许输出空的 packet,也就是说其中没有编码后的数据,仅有 side data。(例如,在编码流程的末尾用于刷新一些流参数等)

AVPacket 是FFmpeg中少数几个其尺寸是公共ABI一部分的类型。因此他可以在stack上分配。

 

AVPacket用于保存音视频编码后的数据,其数据所有权取决于其 buf 字段,其类型是 AVBufferRef *。如果设置了这个字段,那么 packet 中保存的数据是在多个 AVPacket 共享的,且在调用 av_packet_unref() 将其引用计数减少为 0 之前,其一直有效。

如果没有设置 buf 字段,那么 av_packet_ref() 将会执行一个数据拷贝,而不是增加一个引用计数。此时数据保存在 data 字段中,字段 size 描述其大小。

AVPacket 中总是包含side data, 它由 av_malloc()分配,且总是在 av_packet_ref() 时被拷贝,在 av_packet_unref() 时,被释放。

 

其API有:

AVPacket *av_packet_alloc(void);

/*
	分配一个AVPacket结构体,并将其字段设置为默认值。分配生成的结构体必须使用 av_packet_free()释放。
	返回值:成功返回一个AVPacket结构体,失败返回NULL
	注意:这个函数仅分配AVPacket本身,并不包括其内部的数据缓存区。相关的数据缓存区必须通过其他的方式来分配,如 av_new_packet 函数。
*/




void av_packet_free(AVPacket **pkt);

/*
	释放 AVPacket,如果这个packt是引用计数的,那么将减少其引用计数。
	pkt参数:指向将要为释放的Packet,其指针将会被置为NULL,传入一个NULL的操作是无效的。
*/



int av_new_packet(AVPacket *pkt, int size);

/*
	为 AVPacket 分配一块指定大小的缓冲区,并以默认值初始化其各个字段。
	返回值:成功返回 0 ,失败返回 AVERROR_XXX
*/




int av_packet_ref(AVPacket *dst, const AVPacket *src);

/*
	对 packet 做拷贝操作,将 src 拷贝到 dst。
	如果 src 是引用计数的,那么 dst 将会引用 src 中的数据,使其引用计数加 1 。
        如果 src 不是引用计数的,那么会在 dst 中分配一个新的内存,然后将 src 中的数据拷贝过去。dst 其他的字段均拷贝自 src。
	返回值:成功时返回0,失败时返回一个负数的AVERROR。
 */




void av_packet_unref(AVPacket *pkt);

/*
	销毁 packet
	对 packet 的缓存引用解除引用,然后将其剩余字段设置为他们的默认值
*/



void av_init_packet(AVPacket *pkt);

/*
 将 AVPacket 的部分字段初始化为默认值。
 注意:不包括 data 和 size 成员,初始化操作不涉及这两个字段。
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值