zoukankan      html  css  js  c++  java
  • ffmpeg常用数据结构一

    整体结构图:

     

     附:

    聚合(Aggregation) : 表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体

     

    依赖(Dependency):对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类

    AVCodecContext

    这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息,如下列出了部分比较重要的域:

    typedef  struct  AVCodecContext {

        ......

        /**

         * some codecs need / can use extradata like Huffman tables.

         * mjpeg: Huffman tables

         * rv10: additional flags

         * mpeg4: global headers (they can be in the bitstream or here)

         * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger

         * than extradata_size to avoid prolems if it is read with the bitstream reader.

         * The bytewise contents of extradata must not depend on the architecture or CPU endianness.

         * - encoding: Set/allocated/freed by libavcodec.

         * - decoding: Set/allocated/freed by user.

         */

        uint8_t *extradata;

    intextradata_size;

        /**

         * This is the fundamental unit of time (in seconds) in terms

         * of which frame timestamps are represented. For fixed-fps content,

         * timebase should be 1/framerate and timestamp increments should be

         * identically 1.

         * - encoding: MUST be set by user.

         * - decoding: Set by libavcodec.

         */

    AVRationaltime_base;

        /* video only */

        /**

         * picture width / height.

         * - encoding: MUST be set by user.

         * - decoding: Set by libavcodec.

         * Note: For compatibility it is possible to set this instead of

         * coded_width/height before decoding.

         */

    int width, height;

        ......

        /* audio only */

    intsample_rate; ///< samples per second

    int channels;    ///< number of audio channels

        /**

         * audio sample format

         * - encoding: Set by user.

         * - decoding: Set by libavcodec.

         */

    enumSampleFormatsample_fmt;  ///< sample format

        /* The following data should not be initialized. */

        /**

         * Samples per packet, initialized when calling 'init'.

         */

    intframe_size;

    intframe_number;   ///< audio or video frame number

        ......

        char codec_name[32];

    enumAVMediaTypecodec_type; /* see AVMEDIA_TYPE_xxx */

    enumCodecIDcodec_id; /* see CODEC_ID_xxx */

        /**

         * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').

         * This is used to work around some encoder bugs.

         * A demuxer should set this to what is stored in the field used to identify the codec.

         * If there are multiple such fields in a container then the demuxer should choose the one

         * which maximizes the information about the used codec.

         * If the codec tag field in a container is larger then 32 bits then the demuxer should

         * remap the longer ID to 32 bits with a table or other structure. Alternatively a new

         * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated

         * first.

         * - encoding: Set by user, if not then the default based on codec_id will be used.

         * - decoding: Set by user, will be converted to uppercase by libavcodec during init.

         */

        unsigned intcodec_tag;           

        ......

        /**

         * Size of the frame reordering buffer in the decoder.

         * For MPEG-2 it is 1 IPB or 0 low delay IP.

         * - encoding: Set by libavcodec.

         * - decoding: Set by libavcodec.

         */

    inthas_b_frames;

        /**

         * number of bytes per packet if constant and known or 0

         * Used by some WAV based audio codecs.

         */

    intblock_align;

        ......

        /**

         * bits per sample/pixel from the demuxer (needed for huffyuv).

         * - encoding: Set by libavcodec.

         * - decoding: Set by user.

         */

    intbits_per_coded_sample; 

         ......

    } AVCodecContext;

    如果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 avformat_open_input和avformat_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要域的释义如下:

    1.   extradata/extradata_size:这个buffer中存放了解码器可能会用到的额外信息在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。

    2.   time_base

    3.   width/height:视频的宽和高。

    4.   sample_rate/channels:音频的采样率和信道数目。

    5.   sample_fmt: 音频的原始采样格式。

    6.   codec_name/codec_type/codec_id/codec_tag编解码器的信息

  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/elesos/p/2990563.html
Copyright © 2011-2022 走看看