zoukankan      html  css  js  c++  java
  • FFmpeg 结构体学习(三): AVPacket 分析

    在上文FFmpeg 结构体学习(二): AVStream 分析我们学习了AVStream结构体的相关内容。本文,我们将讲述一下AVPacket。

    AVPacket是存储压缩编码数据相关信息的结构体。下面我们来分析一下该结构体里重要变量的含义和作用。

    一、源码整理

    首先我们先看一下结构体AVPacket的定义的结构体源码(位于libavcodec/avcodec.h):

    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:压缩编码的数据。
    
    int   size:data的大小
    
    int64_t pts:显示时间戳
    
    int64_t dts:解码时间戳
    
    int   stream_index:标识该AVPacket所属的视频/音频流。

    针对data做一下说明:对于H.264格式来说,在使用FFMPEG进行视音频处理的时候,我们常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。

  • 相关阅读:
    图文详解AO打印(端桥模式)
    ubuntu svn下载代码出错
    zip error: Invalid command arguments
    秒杀系统设计与实现
    聊聊技术选型
    分布式事务,第三方接口一致性问题
    单系统下的分布式数据库事务方案(拓展spring的事务管理器)AgileBPM多数据的解决方案
    activiti flowable 开源工作流引擎项目整合开发实施实践总结
    java map循环的最优写法(之前写过好多种,这个听说最好记住就行)
    eclipse中maven项目交付svn忽略配置文件(转)
  • 原文地址:https://www.cnblogs.com/renhui/p/9488751.html
Copyright © 2011-2022 走看看