zoukankan      html  css  js  c++  java
  • FFMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表:

    FFMPEG结构体分析:AVFrame
    FFMPEG结构体分析:AVFormatContext
    FFMPEG结构体分析:AVCodecContext
    FFMPEG结构体分析:AVIOContext
    FFMPEG结构体分析:AVCodec
    FFMPEG结构体分析:AVStream
    FFMPEG结构体分析:AVPacket


    FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析:

    FFMPEG中最关键的结构体之间的关系

    在此不再详述,其中AVStream是存储每一个视频/音频流信息的结构体。本文将会分析一下该结构体里重要变量的含义和作用。

    首先看一下结构体的定义(位于avformat.h文件中):

    /* 雷霄骅
     * 中国传媒大学/数字电视技术
     * 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:标识该视频/音频流

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

    该结构体其他字段的作用目前还有待于探索。













  • 相关阅读:
    js简单排序
    js希尔排序
    js直接插入排序
    大数运算
    IOC和AOP的理解 (持续更新)
    频发事件的缓存技巧
    执行上下文深入解析(Execution Context)
    二分
    HDU 3790 最短路径问题 (双重权值)
    浅谈Targan算法
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3901975.html
Copyright © 2011-2022 走看看