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