You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
6.1 KiB
200 lines
6.1 KiB
AVStream是存储每一个视频/音频流信息的结构体。下面我们来分析一下该结构体里重要变量的含义和作用。
|
|
|
|
# 一、源码整理
|
|
|
|
首先我们先看一下结构体AVStream的定义的结构体源码(位于libavformat/avformat.h):
|
|
|
|
|
|
|
|
```
|
|
/**
|
|
* Stream structure.
|
|
* New fields can be added to the end with minor version bumps.
|
|
* Removal, reordering and changes to existing fields require a major
|
|
* version bump.
|
|
* sizeof(AVStream) must not be used outside libav*.
|
|
*/
|
|
typedef struct AVStream {
|
|
int index; /**< stream index in AVFormatContext */
|
|
/**
|
|
* Format-specific stream ID.
|
|
* decoding: set by libavformat
|
|
* encoding: set by the user
|
|
*/
|
|
int id;
|
|
AVCodecContext *codec; /**< codec context */
|
|
/**
|
|
* Real base framerate of the stream.
|
|
* This is the lowest framerate with which all timestamps can be
|
|
* represented accurately (it is the least common multiple of all
|
|
* framerates in the stream). Note, this value is just a guess!
|
|
* For example, if the time base is 1/90000 and all frames have either
|
|
* approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
|
|
*/
|
|
AVRational r_frame_rate;
|
|
void *priv_data;
|
|
|
|
/**
|
|
* encoding: pts generation when outputting stream
|
|
*/
|
|
struct AVFrac pts;
|
|
|
|
/**
|
|
* This is the fundamental unit of time (in seconds) in terms
|
|
* of which frame timestamps are represented. For fixed-fps content,
|
|
* time base should be 1/framerate and timestamp increments should be 1.
|
|
* decoding: set by libavformat
|
|
* encoding: set by libavformat in av_write_header
|
|
*/
|
|
AVRational time_base;
|
|
|
|
/**
|
|
* Decoding: pts of the first frame of the stream in presentation order, in stream time base.
|
|
* Only set this if you are absolutely 100% sure that the value you set
|
|
* it to really is the pts of the first frame.
|
|
* This may be undefined (AV_NOPTS_VALUE).
|
|
* @note The ASF header does NOT contain a correct start_time the ASF
|
|
* demuxer must NOT set this.
|
|
*/
|
|
int64_t start_time;
|
|
|
|
/**
|
|
* Decoding: duration of the stream, in stream time base.
|
|
* If a source file does not specify a duration, but does specify
|
|
* a bitrate, this value will be estimated from bitrate and file size.
|
|
*/
|
|
int64_t duration;
|
|
|
|
int64_t nb_frames; ///< number of frames in this stream if known or 0
|
|
|
|
int disposition; /**< AV_DISPOSITION_* bit field */
|
|
|
|
enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
|
|
|
|
/**
|
|
* sample aspect ratio (0 if unknown)
|
|
* - encoding: Set by user.
|
|
* - decoding: Set by libavformat.
|
|
*/
|
|
AVRational sample_aspect_ratio;
|
|
|
|
AVDictionary *metadata;
|
|
|
|
/**
|
|
* Average framerate
|
|
*/
|
|
AVRational avg_frame_rate;
|
|
|
|
/**
|
|
* For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet
|
|
* will contain the attached picture.
|
|
*
|
|
* decoding: set by libavformat, must not be modified by the caller.
|
|
* encoding: unused
|
|
*/
|
|
AVPacket attached_pic;
|
|
|
|
/*****************************************************************
|
|
* All fields below this line are not part of the public API. They
|
|
* may not be used outside of libavformat and can be changed and
|
|
* removed at will.
|
|
* New public fields should be added right above.
|
|
*****************************************************************
|
|
*/
|
|
|
|
/**
|
|
* Stream information used internally by av_find_stream_info()
|
|
*/
|
|
#define MAX_STD_TIMEBASES (60*12+5)
|
|
struct {
|
|
int64_t last_dts;
|
|
int64_t duration_gcd;
|
|
int duration_count;
|
|
double duration_error[2][2][MAX_STD_TIMEBASES];
|
|
int64_t codec_info_duration;
|
|
int nb_decoded_frames;
|
|
int found_decoder;
|
|
} *info;
|
|
|
|
int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
|
|
|
|
// Timestamp generation support:
|
|
/**
|
|
* Timestamp corresponding to the last dts sync point.
|
|
*
|
|
* Initialized when AVCodecParserContext.dts_sync_point >= 0 and
|
|
* a DTS is received from the underlying container. Otherwise set to
|
|
* AV_NOPTS_VALUE by default.
|
|
*/
|
|
int64_t reference_dts;
|
|
int64_t first_dts;
|
|
int64_t cur_dts;
|
|
int64_t last_IP_pts;
|
|
int last_IP_duration;
|
|
|
|
/**
|
|
* Number of packets to buffer for codec probing
|
|
*/
|
|
#define MAX_PROBE_PACKETS 2500
|
|
int probe_packets;
|
|
|
|
/**
|
|
* Number of frames that have been demuxed during av_find_stream_info()
|
|
*/
|
|
int codec_info_nb_frames;
|
|
|
|
/**
|
|
* Stream Identifier
|
|
* This is the MPEG-TS stream identifier +1
|
|
* 0 means unknown
|
|
*/
|
|
int stream_identifier;
|
|
|
|
int64_t interleaver_chunk_size;
|
|
int64_t interleaver_chunk_duration;
|
|
|
|
/* av_read_frame() support */
|
|
enum AVStreamParseType need_parsing;
|
|
struct AVCodecParserContext *parser;
|
|
|
|
/**
|
|
* last packet in packet_buffer for this stream when muxing.
|
|
*/
|
|
struct AVPacketList *last_in_packet_buffer;
|
|
AVProbeData probe_data;
|
|
#define MAX_REORDER_DELAY 16
|
|
int64_t pts_buffer[MAX_REORDER_DELAY+1];
|
|
|
|
AVIndexEntry *index_entries; /**< Only used if the format does not
|
|
support seeking natively. */
|
|
int nb_index_entries;
|
|
unsigned int index_entries_allocated_size;
|
|
|
|
/**
|
|
* flag to indicate that probing is requested
|
|
* NOT PART OF PUBLIC API
|
|
*/
|
|
int request_probe;
|
|
} AVStream;
|
|
```
|
|
|
|
|
|
|
|
# 二、AVStream 重点字段
|
|
|
|
```
|
|
int index:标识该视频/音频流
|
|
|
|
AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)
|
|
|
|
AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间
|
|
|
|
int64_t duration:该视频/音频流长度
|
|
|
|
AVDictionary *metadata:元数据信息
|
|
|
|
AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)
|
|
|
|
AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
|
|
```
|
|
|
|
|