parent
dc1dc6fea2
commit
1ab0a9a690
@ -0,0 +1,200 @@ |
||||
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音频文件附带的专辑封面。 |
||||
``` |
||||
|
Loading…
Reference in new issue