From 40329000fee156e7438a8bd10b121ef17a3cdb16 Mon Sep 17 00:00:00 2001 From: wenchao1024 <87457873+wenchao1024@users.noreply.github.com> Date: Thu, 6 Jan 2022 14:40:55 +0800 Subject: [PATCH] =?UTF-8?q?Create=20FFmpeg=20=E7=BB=93=E6=9E=84=E4=BD=93?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0(=E4=B8=89)=EF=BC=9A=20AVPacket=20=E5=88=86?= =?UTF-8?q?=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FFmpeg 结构体学习(三): AVPacket 分析.md | 95 ++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 FFmpeg 结构体学习(三): AVPacket 分析.md diff --git a/FFmpeg 结构体学习(三): AVPacket 分析.md b/FFmpeg 结构体学习(三): AVPacket 分析.md new file mode 100644 index 0000000..1062bb8 --- /dev/null +++ b/FFmpeg 结构体学习(三): AVPacket 分析.md @@ -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数据直接写成文件,从而得到视音频的码流文件。