0. 简介

AVPacket结构体并不是很复杂, 但是在ffmpeg中用的非常多. 与其相关的函数也是比较多.

AVPacket保存了解复用之后, 解码之前的数据, 和这些数据相关的一些附加信息.

对于视频来说, AVPacket通常包含一个压缩的frame; 而音频可能包含多个压缩的frame. 一个packet也可能是空的, 不包含任何压缩数据data, 而只包含附加数据side data(容器提供的关于packet的一些附加信息, 例如: 在编码结束的时候更新一些流的参数)

AVPacket是FFmpeg中为数不多的结构之一, 其大小是公共abi的一部分, 因此它可以在堆栈上分配, 如果libavcodec和libavformat没有很大的改动, 就不会向其中添加任何新字段.

官方文档:

AVPacket is one of the few structs in FFmpeg,whose size is a part of public ABI.Thus it may be allocated on stack and no new fields can be added to it without libavcodec and libavformat major bump.

1. AVPacket数据结构定义

ffmpeg 版本3.4.1, struct AVPacket定义于<libavcodec/avcodec.h>

struct AVPacket结构体源码:

 typedef struct AVPacket {
/**
* A reference to the reference-counted buffer where the packet data is
* stored.
* May be NULL, then the packet data is not reference-counted.
*/
AVBufferRef *buf;
/**
* Presentation timestamp in AVStream->time_base units; the time at which
* the decompressed packet will be presented to the user.
* Can be AV_NOPTS_VALUE if it is not stored in the file.
* pts MUST be larger or equal to dts as presentation cannot happen before
* decompression, unless one wants to view hex dumps. Some formats misuse
* the terms dts and pts/cts to mean something different. Such timestamps
* must be converted to true pts/dts before they are stored in AVPacket.
*/
int64_t pts;
/**
* Decompression timestamp in AVStream->time_base units; the time at which
* the packet is decompressed.
* Can be AV_NOPTS_VALUE if it is not stored in the file.
*/
int64_t dts;
uint8_t *data;
int size;
int stream_index;
/**
* A combination of AV_PKT_FLAG values
*/
int flags;
/**
* Additional packet data that can be provided by the container.
* Packet can contain several types of side information.
*/
AVPacketSideData *side_data;
int side_data_elems; /**
* Duration of this packet in AVStream->time_base units, 0 if unknown.
* Equals next_pts - this_pts in presentation order.
*/
int64_t duration; int64_t pos; ///< byte position in stream, -1 if unknown #if FF_API_CONVERGENCE_DURATION
/**
* @deprecated Same as the duration field, but as int64_t. This was required
* for Matroska subtitles, whose duration values could overflow when the
* duration field was still an int.
*/
attribute_deprecated
int64_t convergence_duration;
#endif
} AVPacket;
  • AVBufferRef *buf;

用来管理data指针引用的数据缓存.

  • int64_t pts;

显示时间, 比较关键的数据, 在做seek和播放进度的时候都要用到它, pts只是一个数量, 对应于AVStream->time_base, 要根据time_base才能转换为具体的时间, 音频和视频一般有不同的time_base, 所以在做音视频同步一定要做转换, 不能直接拿pts做.

  • int64_t dts;

基本属性等同于pts, 区别就是dts对应的是解码时间.

  • uint8_t *data;

保存指向未解码数据的指针.

  • int size;

data的大小..

  • int stream_index;

帧数据所属流的索引, 用来区分音频, 视频, 字幕等数据.

  • int flags;

标志,  比如包含AV_PKT_FLAG_KEY值表示是关键帧.

#define AV_PKT_FLAG_KEY 0x0001
#define AV_PKT_FLAG_CORRUPT 0x0002
#define AV_PKT_FLAG_DISCARD 0x0004
#define AV_PKT_FLAG_TRUSTED 0x0008

  • AVPacketSideData *side_data;

容器提供的一些附加数据

  • int side_data_elems;

附加数据元素个数.

  • int64_t duration;

数据的时长, 以所属媒体流的时间基准为单位, 未知则默认值0

  • int64_t pos;

数据在媒体流中的位置, 未知则默认值-1

2. AVPacket相关函数

函数主要分为:

  • AVPacket初始化
  • AVPacket中data数据管理
  • AVPacket中side_data数据管理
 
  • void av_init_packet(AVPacket *pkt);

初始化packet的值为默认值, 该函数不会影响data应用的数据缓存空间和size.

  • int av_new_packet(AVPacket *pkt, int size);

内部调用了av_init_packet(pkt); 而且会为data分配空间.

  • AVPacket *av_packet_alloc(void);

创建一个AVPacket, 将其字段设置为默认值, 没有给data分配空间.

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

增加src->data引用计数.

如果src已经设置了引用计数, 则直接将引用计数+1;

如果src没有设置引用计数, 则创建一个新的引用计数buf, 并复制src->data到buf->buffer中.

最后复制src其它字段到dst中.

  • void av_packet_unref(AVPacket *pkt);

将缓存空间的引用计数-1;

并将packet中的其它字段设置为初始值.

如果引用计数为0, 则释放缓存空间.

  • void av_packet_free(AVPacket **pkt);

释放使用av_packet_alloc 创建的AVPacket,  该函数会调用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 *pkt, const AVPacket *src);

复制src的附加数据到pkt.

  • int av_grow_packet(AVPacket *pkt, int grow_by);

增大pkt->data指向的数据缓存.

  • void av_shrink_packet(AVPacket *pkt, int size)

减小pkt->data指向的数据缓存.

ffmpeg AVPacket结构体及其相关函数的更多相关文章

  1. FFmpeg: AVPacket 结构体分析

    AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长 ...

  2. ffmpeg AVFrame结构体及其相关函数

    0. 简介 AVFrame中存储的是原始数据(例如视频的YUV, RGB, 音频的PCM), 此外还包含了一些相关的信息, 例如: 解码的时候存储了宏块类型表, QP表, 运动矢量等数据. 编码的时候 ...

  3. FFmpeg 常用结构体

    0.FFmpeg 中最关键的结构体之间的关系 FFmpeg 中结构体很多.最关键的结构体可以分成以下几类: 1)解协议(http, rtsp, rtmp, mms) AVIOContext,URLPr ...

  4. Linux中表示“时间”的结构体和相关函数

    转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html      Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...

  5. FFmpeg: AVFormatContext 结构体分析

    AVFormatContext 结构体分析这个结构体描述了一个媒体文件或媒体流的构成和基本信息.这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.主要成员释义: ...

  6. cdev结构体及其相关函数

    一.在Linux2.6内核中一个字符设备用cdev结构来描述,其定义如下: struct cdev { struct kobject kobj; struct module *owner; //所属模 ...

  7. FFmpeg: AVCodecParameters 结构体分析

    /** * This struct describes the properties of an encoded stream. * * sizeof(AVCodecParameters) is no ...

  8. FFMPEG结构体分析:AVPacket

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  9. FFMPEG中最关键的结构体之间的关系

    FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a)        解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要 ...

随机推荐

  1. tesseract 安装及使用

    安装软件 tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 安装即可! 安装完成tesseract-ocr后,需要做一下配置 . 在P ...

  2. 第三章、HTTP报文

    1 报文流 HTTP 报文是在 HTTP 应用程序之间发送的数据块.这些数据块以一些文本形式的元信息(meta-information)开头.这些报文在客户端.服务器和代理之间流动.术语“流入”.“流 ...

  3. WGAN实验环境搭建

    "TensorFlow在Windows上支持Python 3.5.x和3.6.x." 因此,您无法在Windows上使用Python 2.7的tensorflow windows+ ...

  4. 配置连接远程ip的Redis

    1.修改redis服务器的配置文件redis.windows.conf 注释绑定的主机地址 # bind 127.0.0.1 修改redis的守护进程为no,不启用 daemonize "n ...

  5. ELK日志解决方案

    1.方案整体设计 FileBeats+Logstash+ElasticSearch+Kibana 1)ElasticSearch 简称ES,用来做日志数据的存储,当然也可以存储其他数据, ES是互联网 ...

  6. 安装jdk1.8.0_11环境脚本

    安装jdk1.8.0_11的脚本,具体的版本可在脚本中调整,发现最后的重置环境变量没生效,还得再终端界面source /etc/profile [root@ZFVM-APP-- ~]# vim jdk ...

  7. 数据库访问接口之ODBC

    ODBC API 实现数据库操作的手段是句柄.在ODBC中,使用不同的句柄(HANDLE)来标志环境(environment).连接(Connection).语句(statement).描述符(des ...

  8. 免费版CloudFlare CDN基本设置参考

    CDN有很多,网上都有介绍,用户比较多的CloudFlare CDN大家都知道,配置起来也比较简单,合理的配置,才能提升网站的速度和网站安全.不同的网站需求配置不一样,以下是我的配置情况,仅供参考. ...

  9. python 调用父类方法, 重写父类构造方法, 不显式调用,会报错

    子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题 如果子类和父类都有构造函数,子类其实是重写了父类的构造函数,如果不显式调用父类构造函数,父类的构造函数就不会被执行,导致子类 ...

  10. win2008 r2下配置IIS7(ASP.net运行环境)

    一.常规配置: 1.先要设置应用程序池(ApplicationPool)为Classic.NETAppPool. 2.选中左侧的“应用程序池”,选中“Classic.NETAppPool”,单击右侧的 ...