parent
1ab0a9a690
commit
40329000fe
@ -0,0 +1,95 @@ |
|||||||
|
AVPacket是存储压缩编码数据相关信息的结构体。下面我们来分析一下该结构体里重要变量的含义和作用。 |
||||||
|
|
||||||
|
# 一、源码整理 |
||||||
|
|
||||||
|
首先我们先看一下结构体AVPacket的定义的结构体源码(位于libavcodec/avcodec.h): |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
``` |
||||||
|
typedef struct AVPacket { |
||||||
|
/** |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
struct { |
||||||
|
uint8_t *data; |
||||||
|
int size; |
||||||
|
enum AVPacketSideDataType type; |
||||||
|
} *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. |
||||||
|
*/ |
||||||
|
int duration; |
||||||
|
void (*destruct)(struct AVPacket *); |
||||||
|
void *priv; |
||||||
|
int64_t pos; ///< byte position in stream, -1 if unknown |
||||||
|
|
||||||
|
/** |
||||||
|
* Time difference in AVStream->time_base units from the pts of this |
||||||
|
* packet to the point at which the output from the decoder has converged |
||||||
|
* independent from the availability of previous frames. That is, the |
||||||
|
* frames are virtually identical no matter if decoding started from |
||||||
|
* the very first frame or from this keyframe. |
||||||
|
* Is AV_NOPTS_VALUE if unknown. |
||||||
|
* This field is not the display duration of the current packet. |
||||||
|
* This field has no meaning if the packet does not have AV_PKT_FLAG_KEY |
||||||
|
* set. |
||||||
|
* |
||||||
|
* The purpose of this field is to allow seeking in streams that have no |
||||||
|
* keyframes in the conventional sense. It corresponds to the |
||||||
|
* recovery point SEI in H.264 and match_time_delta in NUT. It is also |
||||||
|
* essential for some types of subtitle streams to ensure that all |
||||||
|
* subtitles are correctly displayed after seeking. |
||||||
|
*/ |
||||||
|
int64_t convergence_duration; |
||||||
|
} AVPacket; |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 二、AVPacket 重点字段 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
``` |
||||||
|
uint8_t *data:压缩编码的数据。 |
||||||
|
|
||||||
|
int size:data的大小 |
||||||
|
|
||||||
|
int64_t pts:显示时间戳 |
||||||
|
|
||||||
|
int64_t dts:解码时间戳 |
||||||
|
|
||||||
|
int stream_index:标识该AVPacket所属的视频/音频流。 |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
针对data做一下说明:对于H.264格式来说,在使用FFMPEG进行视音频处理的时候,我们常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。 |
Loading…
Reference in new issue