并且,一个packet也有可能是空的,不包含任何压缩数据data,只含有边缘数据side data(side data,容器提供的关于packet的一些附加信息,例如,在编码结束的时候更新一些流的参数,在另外一篇av_read_frame会介绍) AVPacket的大小是公共的ABI(Public ABI)一部分,这样的结构体在FFmpeg很少,由此也可见AVPacket的重要性,它可以...
AVPacket 中存储的是经过编码的压缩数据。在解码中,AVPacket 由解复用器输出到解码器;在编码中,AVPacket 由编码器输出到复用器。 对于视频而言,一个 AVPacket 通常只包含一个压缩视频帧。而对于音频而言,一个 AVPacket 可能包含多个完整的音频压缩帧。AVPacket 也可以不包含压缩编码数据,而只包含 SideData,这种包...
av_packet_alloc 函数源码如下 :该函数只分配 AVPacket 结构体内存 , 并将所有的字段初始化为 0 ; /** * 分配一个新的 AVPacket 并初始化其字段。 * * @return 如果分配成功,返回一个指向新分配的 AVPacket 的指针;如果分配失败,返回 NULL。 */ AVPacket *av_packet_alloc(void) { // 分配内存,并...
AVPacket *av_packet_alloc(void); 只是为AVPacket结构体赋予初值,里面的data,buf,side_data等都为NULL其它成员的值也都是默认的值 void av_packet_free(AVPacket **pkt); 由av_packet_alloc()创建的AVPacket最后还必须要用av_packet_free()来释放,调用此函数后pkt将置为NULL;内部会调用一次av_packet_unref...
void av_packet_unref(AVPacket *pkt) { //置空packet中side_data相关指针,释放相关结构(不释放结构中指针指向的内容) av_packet_free_side_data(pkt); //释放pkt->buf结构,不释放这个结构指向的内容 //buf的refcount原子减,如果AVBuffer引用计数为1则调用AVBuffer的free ...
结果相当于传入的这个AVPacket指针被掏空,音视频数据依然可能被其他AVPacket持有。真正释放AVPacket中音视频数据buffer的操作也应该是在这里。 void av_packet_unref(AVPacket *pkt) { //置空packet中side_data相关指针,释放相关结构(不释放结构中指针指向的内容) ...
对于视频而言,一个AVPacket通常只包含一个压缩视频帧。而对于音频而言,一个AVPacket可能包含多个完整的音频压缩帧。AVPacket也可以不包含压缩编码数据,而只包含side data,这种包可以称为空packet。例如,编码结束后只需要更新一些参数时就可以发空packet。 AVPacket对象可以在栈上分配,注意此处指的是AVPacket对象本身。而...
AVPacketSideData *side_data; //容器提供的一些附加数据 int side_data_elems; //边缘数据元数个数 int64_t duration; //数据的时长,以所属媒体流的时间基准为单位,未知则值为默认值0 int64_t pos; //数据在流媒体中的位置,未知则值为默认值-1 #...
side_data等都为NULL,它内部会调用av_init_packet()方法AVPacket*allocpkt=av_packet_alloc();// 为buf分配内存,并且将data指向该内存,并且将引用计数设置为1av_new_packet(allocpkt,200);// 引用计数减少1;如果引用计数为0,data内存将在此函数中释放,并且data和buf字段都置为NULL...这里是伪代码。。。
*/AVPacketSideData*side_data;intside_data_elems;/** * Duration of this packet in AVStream->time_base units, 0 if unknown. * Equals next_pts - this_pts in presentation order. */int64_tduration;int64_tpos;///< byte position in stream, -1 if unknown#ifFF_API_CONVERGENCE_DURATION/**...