avcodec.h(结构体AVPacket)

typedef struct AVPacket {
    /**
	 * 缓冲区
     */
    AVBufferRef *buf;
    /**
	 * 翻译:FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。
	 *  顾名思义,前者是解码的时间,后者是显示的时间。要仔细理解这两个概念,需要先了解FFmpeg中的packet和frame的概念。
	 *  FFmpeg中用AVPacket结构体来描述解码前或编码后的压缩包,用AVFrame结构体来描述解码后或编码前的信号帧。
	 *  对于视频来说,AVFrame就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的PTS。DTS是AVPacket里的一个成员,
	 *  表示这个压缩包应该什么时候被解码。 如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。
	 *  可事实上,在大多数编解码标准(如H.264或HEVC)中,编码顺序和输入顺序并不一致。 于是才会需要PTS和DTS这两种不同的时间戳
	 *  理解:就是给视频一个编解码的顺序。
     */
    int64_t pts;
    int64_t dts;
	/*压缩编码的数据*/
    uint8_t *data;
	/*data的大小*/
    int   size;
	/*标识该AVPacket所属的视频/音频流*/
    int   stream_index;
    int   flags;
    AVPacketSideData *side_data;
    int side_data_elems;
    int   duration;
#if FF_API_DESTRUCT_PACKET
    attribute_deprecated
    void  (*destruct)(struct AVPacket *);
    attribute_deprecated
    void  *priv;
#endif
    int64_t pos;                            ///< byte position in stream, -1 if unknown
    int64_t convergence_duration;
} AVPacket;



每一个包是一个完整的数据帧,来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)

//注意保存音视频数据包的内存

是 malloc 出来的,用完后应及时用 free 归还给系统

1. typedef struct AVPacket  

2. {  

3.     int64_t pts;  

4.     int64_t dts;  

5.     int64_t pos;  

6.     uint8_t *data;//数据首地址  

7.     int size;  

8.     int stream_index;  

9.     int flags;//flags为标志域,1表示该数据是一个关键帧  

10.     void(*destruct)(struct AVPacket*);//释放数据缓冲区的函数指针  

11. } AVPacket;  

以上是AVPacket结构体的成员变量

    uint8_t *data:压缩编码的数据。

    例如对于H.264来说。1个AVPacket的data通常对应一个NAL。

    注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流

    因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

    int   size:data的大小

    int64_t pts:显示时间戳

    int64_t dts:解码时间戳

int   stream_index:标识该AVPacket所属的视频/音频流。

 

关于pts和dts:

FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)PTS(Presentation Time Stamp)。 顾名思义,前者是解码的时间,后者是显示的时间。要仔细理解这两个概念,需要先了解FFmpeg中的packet和frame的概念。

FFmpeg中用AVPacket结构体来描述解码前或编码后的压缩包,用AVFrame结构体来描述解码后或编码前的信号帧。 对于视频来说,AVFrame就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的PTS。DTS是AVPacket里的一个成员,表示这个压缩包应该什么时候被解码。 如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如H.264或HEVC)中,编码顺序和输入顺序并不一致。 于是才会需要PTS和DTS这两种不同的时间戳。

 

关于AVPacket和AVFrame:

AVPacket(相当于一个容器)

–存储一帧压缩编码数据。

AVFrame

–存储一帧解码后像素(采样)数据。







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值