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

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

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


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

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

    在此不再详述,其中AVPacket是存储压缩编码数据相关信息的结构体。本文将会详细分析一下该结构体里重要变量的含义和作用。

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

    /* 雷霄骅
     * 中国传媒大学/数字电视技术
     * leixiaohua1020@126.com
     *
     */
    typedef struct AVPacket {
        /**
         * Presentation timestamp in AVStream->time_base units; the time at which
         * the decompressed packet will be presented to the user.
         * Can be AV_NOPTS_VALUE if it is not stored in the file.
         * pts MUST be larger or equal to dts as presentation cannot happen before
         * decompression, unless one wants to view hex dumps. Some formats misuse
         * the terms dts and pts/cts to mean something different. Such timestamps
         * must be converted to true pts/dts before they are stored in AVPacket.
         */
        int64_t pts;
        /**
         * Decompression timestamp in AVStream->time_base units; the time at which
         * the packet is decompressed.
         * Can be AV_NOPTS_VALUE if it is not stored in the file.
         */
        int64_t dts;
        uint8_t *data;
        int   size;
        int   stream_index;
        /**
         * A combination of AV_PKT_FLAG values
         */
        int   flags;
        /**
         * Additional packet data that can be provided by the container.
         * Packet can contain several types of side information.
         */
        struct {
            uint8_t *data;
            int      size;
            enum AVPacketSideDataType type;
        } *side_data;
        int side_data_elems;
    
        /**
         * Duration of this packet in AVStream->time_base units, 0 if unknown.
         * Equals next_pts - this_pts in presentation order.
         */
        int   duration;
        void  (*destruct)(struct AVPacket *);
        void  *priv;
        int64_t pos;                            ///< byte position in stream, -1 if unknown
    
        /**
         * Time difference in AVStream->time_base units from the pts of this
         * packet to the point at which the output from the decoder has converged
         * independent from the availability of previous frames. That is, the
         * frames are virtually identical no matter if decoding started from
         * the very first frame or from this keyframe.
         * Is AV_NOPTS_VALUE if unknown.
         * This field is not the display duration of the current packet.
         * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
         * set.
         *
         * The purpose of this field is to allow seeking in streams that have no
         * keyframes in the conventional sense. It corresponds to the
         * recovery point SEI in H.264 and match_time_delta in NUT. It is also
         * essential for some types of subtitle streams to ensure that all
         * subtitles are correctly displayed after seeking.
         */
        int64_t convergence_duration;
    } AVPacket;

    在AVPacket结构体中,重要的变量有以下几个:

    uint8_t *data:压缩编码的数据。

    例如对于H.264来说。1个AVPacket的data通常对应一个NAL。

    注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流

    因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

    int   size:data的大小

    int64_t pts:显示时间戳

    int64_t dts:解码时间戳

    int   stream_index:标识该AVPacket所属的视频/音频流。

    这个结构体虽然比较简单,但是非常的常用。




  • 相关阅读:
    面向 部分
    并发 编程
    数据库 部分
    匿名函数
    Linux 30岁,这些年经历了什么?
    漫谈 HTTP 连接
    华为交换机命令基础入门学习,小白也能看得懂!
    一文讲透APaaS平台是什么
    什么是边缘CDN和虚拟CDN (vCDN)?
    systemd进程管理工具实战教程
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3901974.html
Copyright © 2011-2022 走看看