FFMPEG结构体分析:AVStream

来源:互联网 发布:清华网络学堂手机 编辑:程序博客网 时间:2024/06/05 01:17

本文转自: http://blog.csdn.net/leixiaohua1020/article/details/14215821


AVStream是保存一个视/音频流信息的结构体。

/* 雷霄骅 * 中国传媒大学/数字电视技术 * leixiaohua1020@126.com * *//** * 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: 标识该视频/音频流。例如:如果同时存在音频和视频,可能会是视频对应的AVStream的index为0, 音频的Index为1。

如果只有视频,那其对应的AVStream的index就为0.


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音频文件附带的专辑封面。


0 0
原创粉丝点击