avcodec.h(结构体AVPacket)

来源:互联网 发布:java mysql 编辑:程序博客网 时间:2024/06/06 02:56
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

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







1 0