当前位置: 代码迷 >> 综合 >> FFmpeg AVStream结构体
  详细解决方案

FFmpeg AVStream结构体

热度:92   发布时间:2024-02-05 20:38:57.0

结构体 

typedef struct AVStream {int index;    /**< stream index in AVFormatContext *//*** Format-specific stream ID.* decoding: set by libavformat* encoding: set by the user, replaced by libavformat if left unset*/int id;/*** Codec context associated with this stream. Allocated and freed by* libavformat.** - decoding: The demuxer exports codec information stored in the headers*             here.* - encoding: The user sets codec information, the muxer writes it to the*             output. Mandatory fields as specified in AVCodecContext*             documentation must be set even if this AVCodecContext is*             not actually used for encoding.*/AVCodecContext *codec;void *priv_data;#if FF_API_LAVF_FRAC/*** @deprecated this field is unused*/attribute_deprecatedstruct AVFrac pts;
#endif/*** This is the fundamental unit of time (in seconds) in terms* of which frame timestamps are represented.** decoding: set by libavformat* encoding: May be set by the caller before avformat_write_header() to*           provide a hint to the muxer about the desired timebase. In*           avformat_write_header(), the muxer will overwrite this field*           with the timebase that will actually be used for the timestamps*           written into the file (which may or may not be related to the*           user-provided one, depending on the format).*/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 0int 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** - demuxing: May be set by libavformat when creating the stream or in*             avformat_find_stream_info().* - muxing: May be set by the caller before avformat_write_header().*/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;/*** An array of side data that applies to the whole stream (i.e. the* container does not allow it to change between packets).** There may be no overlap between the side data in this array and side data* in the packets. I.e. a given side data is either exported by the muxer* (demuxing) / set by the caller (muxing) in this array, then it never* appears in the packets, or the side data is exported / sent through* the packets (always in the first packet where the value becomes known or* changes), then it does not appear in this array.** - demuxing: Set by libavformat when the stream is created.* - muxing: May be set by the caller before avformat_write_header().** Freed by libavformat in avformat_free_context().** @see av_format_inject_global_side_data()*/AVPacketSideData *side_data;/*** The number of elements in the AVStream.side_data array.*/int            nb_side_data;/*** Flags for the user to detect events happening on the stream. Flags must* be cleared by the user once the event has been handled.* A combination of AVSTREAM_EVENT_FLAG_*.*/int event_flags;
#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata./****************************************************************** 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 (30*12+7+6)struct {int64_t last_dts;int64_t duration_gcd;int duration_count;int64_t rfps_duration_sum;double (*duration_error)[2][MAX_STD_TIMEBASES];int64_t codec_info_duration;int64_t codec_info_duration_fields;/*** 0  -> decoder has not been searched for yet.* >0 -> decoder found* <0 -> decoder with codec_id == -found_decoder has not been found*/int found_decoder;int64_t last_duration;/*** Those are used for average framerate estimation.*/int64_t fps_first_dts;int     fps_first_dts_idx;int64_t fps_last_dts;int     fps_last_dts_idx;} *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 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 2500int probe_packets;/*** Number of frames that have been demuxed during av_find_stream_info()*/int codec_info_nb_frames;/* 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 16int64_t pts_buffer[MAX_REORDER_DELAY+1];AVIndexEntry *index_entries; /**< Only used if the format does notsupport seeking natively. */int nb_index_entries;unsigned int index_entries_allocated_size;/*** 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.** Code outside avformat should access this field using:* av_stream_get/set_r_frame_rate(stream)*/AVRational r_frame_rate;/*** 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;/*** stream probing state* -1   -> probing finished*  0   -> no probing requested* rest -> perform probing with request_probe being the minimum score to accept.* NOT PART OF PUBLIC API*/int request_probe;/*** Indicates that everything up to the next keyframe* should be discarded.*/int skip_to_keyframe;/*** Number of samples to skip at the start of the frame decoded from the next packet.*/int skip_samples;/*** If not 0, the first audio sample that should be discarded from the stream.* This is broken by design (needs global sample count), but can't be* avoided for broken by design formats such as mp3 with ad-hoc gapless* audio support.*/int64_t first_discard_sample;/*** The sample after last sample that is intended to be discarded after* first_discard_sample. Works on frame boundaries only. Used to prevent* early EOF if the gapless info is broken (considered concatenated mp3s).*/int64_t last_discard_sample;/*** Number of internally decoded frames, used internally in libavformat, do not access* its lifetime differs from info which is why it is not in that structure.*/int nb_decoded_frames;/*** Timestamp offset added to timestamps before muxing* NOT PART OF PUBLIC API*/int64_t mux_ts_offset;/*** Internal data to check for wrapping of the time stamp*/int64_t pts_wrap_reference;/*** Options for behavior, when a wrap is detected.** Defined by AV_PTS_WRAP_ values.** If correction is enabled, there are two possibilities:* If the first time stamp is near the wrap point, the wrap offset* will be subtracted, which will create negative time stamps.* Otherwise the offset will be added.*/int pts_wrap_behavior;/*** Internal data to prevent doing update_initial_durations() twice*/int update_initial_durations_done;/*** Internal data to generate dts from pts*/int64_t pts_reorder_error[MAX_REORDER_DELAY+1];uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1];/*** Internal data to analyze DTS and detect faulty mpeg streams*/int64_t last_dts_for_order_check;uint8_t dts_ordered;uint8_t dts_misordered;/*** Internal data to inject global side data*/int inject_global_side_data;/*** String containing paris of key and values describing recommended encoder configuration.* Paris are separated by ','.* Keys are separated from values by '='.*/char *recommended_encoder_configuration;/*** display aspect ratio (0 if unknown)* - encoding: unused* - decoding: Set by libavformat to calculate sample_aspect_ratio internally*/AVRational display_aspect_ratio;
} AVStream;

 AVStream 重点字段

int index; //在AVFormatContext中的索引,这个数字是自动生成的,可以通过这个数字从AVFormatContext::streams表中索引到该流。
int id;//流的标识,依赖于具体的容器格式。解码:由libavformat设置。编码:由用户设置,如果未设置则由libavformat替换。
AVCodecContext *codec;//指向该流对应的AVCodecContext结构,调用avformat_open_input时生成。
AVRational time_base;//这是表示帧时间戳的基本时间单位(以秒为单位)。该流中媒体数据的pts和dts都将以这个时间基准为粒度。
int64_t start_time;//流的起始时间,以流的时间基准为单位。如需设置,100%确保你设置它的值真的是第一帧的pts。
int64_t duration;//解码:流的持续时间。如果源文件未指定持续时间,但指定了比特率,则将根据比特率和文件大小估计该值。
int64_t nb_frames; //此流中的帧数(如果已知)或0。
enum AVDiscard discard;//选择哪些数据包可以随意丢弃,不需要去demux。
AVRational sample_aspect_ratio;//样本长宽比(如果未知,则为0)。
AVDictionary *metadata;//元数据信息。
AVRational avg_frame_rate;//平均帧速率。解封装:可以在创建流时设置为libavformat,也可以在avformat_find_stream_info()中设置。封装:可以由调用者在avformat_write_header()之前设置。
AVPacket attached_pic;//附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
int probe_packets;//编解码器用于probe的包的个数。
int codec_info_nb_frames;//在av_find_stream_info()期间已经解封装的帧数。
int request_probe;//流探测状态,1表示探测完成,0表示没有探测请求,rest 执行探测。
int skip_to_keyframe;//表示应丢弃直到下一个关键帧的所有内容。
int skip_samples;//在从下一个数据包解码的帧开始时要跳过的采样数。
int64_t start_skip_samples;//如果不是0,则应该从流的开始跳过的采样的数目。
int64_t first_discard_sample;//如果不是0,则应该从流中丢弃第一个音频样本。

int64_t pts_reorder_error[MAX_REORDER_DELAY+1];
uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1];//内部数据,从pts生成dts。

int64_t last_dts_for_order_check;
uint8_t dts_ordered;
uint8_t dts_misordered;//内部数据,用于分析dts和检测故障mpeg流。
AVRational display_aspect_ratio;//显示宽高比。

  相关解决方案