• FFMPEG关键结构体


    // FFMPEG关键结构体:
    // 转载 http://blog.csdn.net/leixiaohua1020/article/details/14214577
    // 2016.2.26

    AVFrame(位于avcodec.h)结构体一般用于存储原始数据。
    ===============================================================================
    下面看几个主要变量的作用(在这里考虑解码的情况):
    uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUV,RGB,对音频来说是PCM)
    int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,一般大于图像的宽。
    int width, height:视频帧宽和高(1920x1080,1280x720...)
    int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个
    int format:解码后原始数据类型(YUV420,YUV422,RGB24...)
    int key_frame:是否是关键帧
    enum AVPictureType pict_type:帧类型(I,B,P...)
    AVRational sample_aspect_ratio:宽高比(16:9,4:3...)
    int64_t pts:显示时间戳
    int coded_picture_number:编码帧序号
    int display_picture_number:显示帧序号
    int8_t *qscale_table:QP表
    uint8_t *mbskip_table:跳过宏块表
    int16_t (*motion_val[2])[2]:运动矢量表
    uint32_t *mb_type:宏块类型表
    short *dct_coeff:DCT系数,这个没有提取过
    int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)
    int interlaced_frame:是否是隔行扫描
    uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的

    AVFormatContext(位于avformat.h)是一个贯穿始终的数据结构,很多函数都要用到它作为参数,
    它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
    ===============================================================================
    下面看几个主要变量的作用(在这里考虑解码的情况):
    struct AVInputFormat *iformat:输入数据的封装格式
    AVIOContext *pb:输入数据的缓存
    unsigned int nb_streams:视音频流的个数
    AVStream **streams:视音频流
    char filename[1024]:文件名
    int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
    int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
    AVDictionary *metadata:元数据

    AVCodecContext(位于avcodec.h)中很多的参数是编码的时候使用的
    ===============================================================================
    下面挑一些关键的变量来看看(这里只考虑解码)。
    enum AVMediaType codec_type:编解码器的类型(视频,音频...)
    struct AVCodec *codec:采用的解码器AVCodec(H.264,MPEG2...)
    int bit_rate:平均比特率
    uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储SPS,PPS等)
    AVRational time_base:根据该参数,可以把PTS转化为实际的时间(单位为秒s)
    int width, height:如果是视频的话,代表宽和高
    int refs:运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
    int sample_rate:采样率(音频)
    int channels:声道数(音频)
    enum AVSampleFormat sample_fmt:采样格式
    int profile:型(H.264里面就有,其他编码标准应该也有)
    int level:级(和profile差不太多)

    AVIOContext(位于avio.h)是FFMPEG管理输入输出数据的结构体。
    ===============================================================================
    AVIOContext中有以下几个变量比较重要:
    unsigned char *buffer:缓存开始位置
    int buffer_size:缓存大小(默认32768)
    unsigned char *buf_ptr:当前指针读取到的位置
    unsigned char *buf_end:缓存结束的位置
    void *opaque:URLContext结构体

    AVCodec(位于avcodec.h)是存储编解码器信息的结构体。
    ===============================================================================
    下面说一下最主要的几个变量:
    const char *name:编解码器的名字,比较短
    const char *long_name:编解码器的名字,全称,比较长
    enum AVMediaType type:指明了类型,是视频,音频,还是字幕
    enum AVCodecID id:ID,不重复
    const AVRational *supported_framerates:支持的帧率(仅视频)
    const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
    const int *supported_samplerates:支持的采样率(仅音频)
    const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
    const uint64_t *channel_layouts:支持的声道数(仅音频)
    int priv_data_size:私有数据的大小

    AVStream(位于avformat.h)是存储每一个视频/音频流信息的结构体。
    ===============================================================================
    重要的变量如下所示:
    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音频文件附带的专辑封面。

    AVPacket(位于avcodec.h)是存储压缩编码数据相关信息的结构体。
    ===============================================================================
    重要的变量有以下几个:
    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所属的视频/音频流。

  • 相关阅读:
    iOS NSDictionary或NSArray与JSON字符串相互转换
    iOS 如何用Xib画一个Button
    iOS 你不知道的字符串用法
    IOS ScrollView pagingEnabled移动指定偏移
    TableView行缩进 自定义cell时候
    支付宝回调
    微信支付回调
    关于Bundle传递消息
    关于Handler
    ExpandableListView
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/5225614.html
Copyright © 2020-2023  润新知