• AVFrame


    AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据。编码的时候也存储了相关的数据。因此在使用FFMPEG进行码流分析的时候,AVFrame是一个很重要的结构体。

    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的

    其他的变量不再一一列举,源代码中都有详细的说明。在这里重点分析一下几个需要一定的理解的变量:

    1.data[]

    对于packed格式的数据(例如RGB24),会存到data[0]里面。

    对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]...(YUV420P中data[0]存Y,data[1]存U,data[2]存V)

    具体参见:FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)(https://blog.csdn.net/leixiaohua1020/article/details/14215391)

    提高技能如同提升自信心。
  • 相关阅读:
    JAVA Rest High Level Client如何取聚合后的数据
    elasticsearch中TermQuery查不到数据问题
    项目中redis改brpop阻塞模式为订阅模式的实现(二)
    项目中redis改brpop阻塞模式为订阅模式的实现(一)
    《算法笔记》5. 前缀树、桶排序、排序算法总结
    《算法笔记》4. 堆与堆排序、比较器详解
    《算法笔记》3. 归并排序、随机快排整理
    《算法笔记》2. 链表、栈、队列、递归、哈希表、顺序表
    《算法笔记》1. 复杂度、排序、二分、异或
    深入理解Java线程状态转移
  • 原文地址:https://www.cnblogs.com/chims-liu-touch/p/14493335.html
Copyright © 2020-2023  润新知