FFMPEG结构体分析之AVStream

网友投稿 727 2022-11-21

FFMPEG结构体分析之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 { //AVFormatContext中的流索引,标识视频流或者音频流 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; void *priv_data; /** * 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). */ //时基, 通过time_base可以把dts/pts转化为真正的时间。ffmpeg其他结构体中也有这个字段,只有AVStream中的time_base*pts=真正的时间(雷神) 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. * * Encoding: May be set by the caller before avformat_write_header() to * provide a hint to the muxer about the estimated duration. */ 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 * * - 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 indicating events happening on the stream, a combination of * AVSTREAM_EVENT_FLAG_*. * * - demuxing: may be set by the demuxer in avformat_open_input(), * avformat_find_stream_info() and av_read_frame(). Flags must be cleared * by the user once the event has been handled. * - muxing: may be set by the user after avformat_write_header(). to * indicate a user-triggered event. The muxer will clear the flags for * events it has handled in av_[interleaved]_write_frame(). */ int event_flags;/** * - demuxing: the demuxer read new metadata from the file and updated * AVStream.metadata accordingly * - muxing: the user updated AVStream.metadata and wishes the muxer to write * it into the file */#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001/** * - demuxing: new packets for this stream were read from the file. This * event is informational only and does not guarantee that new packets * for this stream will necessarily be returned from av_read_frame(). */#define AVSTREAM_EVENT_FLAG_NEW_PACKETS (1 << 1) /** * 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; /** * Codec parameters associated with this stream. Allocated and freed by * libavformat in avformat_new_stream() and avformat_free_context() * respectively. * * - demuxing: filled by libavformat on stream creation or in * avformat_find_stream_info() * - muxing: filled by the caller before avformat_write_header() */ //与此流关联的编解码器参数 AVCodecParameters *codecpar; /** * Number of bits in timestamps. Used for wrapping control. * * - demuxing: set by libavformat * - muxing: set by libavformat * */ int pts_wrap_bits; /** * An opaque field for libavformat internal usage. * Must not be accessed in any way by callers. */ AVStreamInternal *internal;} AVStream;

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:FFmpeg源代码:avcodec_send_packet
下一篇:HuaWei ❀ IPv4组播地址梳理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~