美文网首页
ffmpeg基础知识

ffmpeg基础知识

作者: Simplelove_f033 | 来源:发表于2019-03-20 01:59 被阅读0次

    ffmpeg是音视频处理的c库, 音视频在网络传输过程中,由于数据量大,所有需要进行压缩
    压缩目的为了去除冗余信息,冗余信息分为:
    1、空间冗余:图像相邻像素之间有较强的相关性
    2、时间冗余:视频序列的相邻图像之间内容相似
    3、 编码冗余:不同像素值出现的概率不同
    ​4、 视觉冗余:人的视觉系统对某些细节不敏感
    ​ 5、知识冗余:规律性的结构可由先验知识和背景知识得到

    压缩分类:

    ● 无损压缩(Winzip)
    ​ 压缩前解压缩后图像完全一致
    ​ 压缩比低

    ● 有损压缩(H.264)
    ​ 压缩前解压缩后图像不一致
    ​ 压缩比高
    ​ 利用人的视觉系统的特性(人眼能见的动画频率和图像细节有限制)

    音视频压缩其实就是对音视频进行编码,
    视频编码格式


    image.png

    音频编码格式


    image.png

    封装格式


    image.png

    流媒体协议


    image.png

    YUV简介

    YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
    YUV是编译true-color颜色空间(colorspace)的种类,Y'UV,YUV,YCbCrYPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是**[色度]
    YUV格式有两大类:(平面格式)planar和(打包格式)packed。

    1.planar:先存储Y,然后U,然后V

    2.packed:yuv交叉存储

    还有我们常说的YUV420sp与YUV420p。

    YUV420sp: 一种two-plane模式,即Y和UV分为两个平面,U、V交错排列。

    YUV420p: 先把U存放完后,再存放V。UV是连续的。

    YUV420的数据大小为: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:WH3/2,

    普遍的编码器都以接受planar的I420数据(YUV420P)

    4*4的I420数据排列如下:

    y1 y2 y3 y4

    y5 y6 y7 y8

    y9 y10 y11 y12

    y13 y14 y15 y16

    u1 u2 u3 u4

    v1 v2 v3 v4
    Android相机的采集的视频是NV21(YUV420sP), 也是YUV的格式 只不过U和V的交叉的。
    y1 y2 y3 y4

    y5 y6 y7 y8

    y9 y10 y11 y12

    y13 y14 y15 y16

    u1 v1 u2 v2

    u3 v3 u4 v4
    在采集相机数据时需要把UV数据给转换成上面的 顺序。

    H.264 I,P,B帧和PTS,DTS

    I frame :帧内编码帧 ,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。

    P frame: 前向预测编码帧,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;

    B frame: 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;

    I frame:自身可以通过视频解压算法解压成一张单独的完整的图片。

    P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。

    B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。

    PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来

    DTS:Decode Time Stamp。DTS主要是标识读入内存中的帧数据在什么时候开始送入解码器中进行解码。

    在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。

    DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。


    image.png

    如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

    FFmpeg核心模块

    libavformat

    ​ 用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。

    libavcodec

    ​ 用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。

    libavfilter

    ​ filter(FileIO、FPS、DrawText)音视频滤波器的开发,如水印、倍速播放等。

    libavutil

    ​ 包含一些公共的工具函数的使用库,包括算数运算 字符操作;

    libswresample

    ​ 原始音频格式转码。

    libswscale
    ​ (原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。

    音视频解5封装流程:


    image.png

    ffmpeg解码流程:


    解码流程.png
    ffmpeg核心类的结构和作用
    常用结构体.png

    相关文章

      网友评论

          本文标题:ffmpeg基础知识

          本文链接:https://www.haomeiwen.com/subject/gzcamqtx.html