zoukankan      html  css  js  c++  java
  • 1.ffmpeg基础经常使用知识

    1.封装格式
    MPEG-4
    其中 MPEG-1 和 MPEG-2 是采用相同原理为基础的预测编码、变换编码、 熵编码及运动补偿等第一代数据压缩编码技术;
    MPEG-4(ISO/IEC 14496)则是基于第二代压缩编码技术制定的国际标准,它以视听媒体对象为基本单元,采用基于内容的压缩编码,实现数字视音频、图形合成应用及交互式多媒体的集成。 MPEG 系列标准对 VCD、 DVD 等视听消费电子及数字电视和高清晰度电视(DTV&&HDTV)、 多媒体通讯等信息产业的发展产生了巨大而深远的影响.
    AVI
    AVI,音频视频交错(Audio Video Interleaved)的英文缩写。 AVI 格式调用方便、图像质量好,压缩标准可任意选择,是应用最普遍、也是应用时间最长的格式之一。

    FLV
    FLV 是 FLASH VIDEO 的简称, FLV 流媒体格式是一种新的视频格式。因为它造成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入 Flash 后,使导出的 SWF 文件体积庞大,不能在网络上很好的使用等缺点。html


    2.编码格式
    视频部分
    h26四、wmv、xvid、mjpeg(摄像头出来的每一帧都是mjpeg,缺点在于只有I帧、没有B帧、P帧)
    音频部分
    acc、MP三、ape、flac

    3.文件封装格式和编码格式数组

     

     音频帧和视频帧的帧率是不一致的,好比音频帧采样率是44.1khz,声音必须的源源不断输出,因此音频帧率可能为22.05帧,每一个帧里存了2K采样数据.

    视频解码网络

    • 软件解码:即经过软件让CPU来对视频进行解码处理,缺点耗电发热,优势兼容强
    • 硬件解码:是将原来所有交由CPU(显卡上的一个核心处理芯片,处理计算机中与图形计算有关的工做)来处理的视频数据的部分交由GPU来作,优势不须要太好的CPU,发热低,缺点起步较晚,没法与软解相提并论,兼容性不强.硬解码都是固定帧率.好比只能60帧. 

    音频解码ide

    • 将音频码流(aac、ape等)解码成pcm


    4.像素格式
    压缩编码中通常使用的是RGB24,YUV420 , YUV420P, YUV422P, YUV444P等格式数据,最多见的是YUV420P.
    RGB格式
    BMP文件存储的就是RGB格式像素数据
    yuv格式
        y表示明亮度,而u(Cb 蓝色色差值)和v(Cr 红色色差值)则表示色度值.它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息同样能够显示完整的图像,只不过是黑白的,因为UV色度不是很明显看出,因此除了YUV4:4:4外,又诞生了YUV4:2:2,YUV4:2:0格式.从而占用极少的存储数据.post

        以下图所示,黑点表示该像素点的Y份量,以空心圆圈表示像素点的UV份量:学习

    • YUV444:每个Y对应一组UV份量,单位为字节,因此每一个像素点有1个Y字节和1组(2字节,分别是U和V),因此为3字节.
    • YUV422:每两个Y共用一组UV份量,因此每一个每一个像素点有1个Y字节和1/2组UV(1字节),因此为2字节.
    • YUV420:每四个Y共用一组UV份量,因此4个像素点为5字节,每2个像素点为2.5字节,因为4个像素点是矩形构成的,为了加快换算,因此每2个像素点共用3字节,每一个像素点为1.5字节(12bit).

    YUV420、YUV420P、YUV420SP区别ui

    • 对于YUV420格式(packed封装),每一个像素点的Y,U,V是连续交*存储的。因此存储数据时,data[0]中就存的是yuvyuvyuv...
    • 对于YUV420P格式(planar平面封装),先连续存储全部像素点的Y,紧接着存储全部像素点的U,随后是全部像素点的V,好比:YYYYYYYY UU VV,因此Ffmpeg中存储P格式数据时,data[0]数组存y,data[1]数组存u,data[2]数组存v
    • 对于YUV420SP格式(semi Planar半平面封装),先连续存储全部像素点的Y,而后连续存储UV,好比:YYYYYYYY UVUV

    5.YUV和RGB转换格式编码

    RGB 转换成 YUVspa

    • Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 
    • Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 
    • Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128

    YUV 转换成 RGBcode

    • B = 1.164(Y - 16) + 2.018(U - 128) 
    • G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) 
    • R = 1.164(Y - 16) + 1.596(V - 128)

    RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
    如下是通过简化的公式,运算量比上述公式要小一些。
    RGB转YUV

    • Y = 0.299R + 0.587G + 0.114B 
    • U'= (BY)*0.565 
    • V'= (RY)*0.713

    YUV转RGB

    • R = Y + 1.403V' 
    • G = Y - 0.344U' - 0.714V' 
    • B = Y + 1.770U'

    PS:除了软解以外,则还能够交给GPU进行硬解.

    6.DTS、PTS、GOP

    • dts : 解码时间戳
    • pts : 显示时间戳
    • GOP : 一组完整的IBP帧画面

    而dts和pts值是不必定是相等的,以下图GOP(Group of Picture)所示:

    从上图,能够看到,DTS和PTS的顺序是不一致的,而且每组GOP中开头都是I帧,而后后面都是B、P帧,若是开头的I帧图像质量比较差时,也会影响到一个GOP中后续B、P帧的图像质量.

    • I帧(intra picture) : 帧内编码帧,它将全帧图像信息进行 JPEG 压缩编码及传输,是一个完整图像
    • B帧(bidirectional) : 双向预测内插编码帧,参考前面和后面两帧的数据加上本帧的变化而得出的本帧数据
    • P帧 : 前向预测编码帧,参考前面而得出的本帧数据.

    通常平均来讲, I 的压缩率是 7(跟 JPG 差很少), P 是 20, B 能够达到 50.

    在ffmpeg中,pts和dts单位都是不肯定,若是要换算为时分秒,则须要AVStream的time_base时基来一块儿换算出当前显示的标准时间
    而time_base结构体为AVRational:

    因此计算时分秒为:

    if (frame->pts != AV_NOPTS_VALUE)    
        dpts = av_q2d(is->video_st->time_base) * frame->pts;
  • 相关阅读:
    UI控件
    iOS 上架
    UISwitch 开关
    UISlider 的属性
    SQL SERVER 触发器
    sql server数据库操作
    二叉堆实现优先队列
    散列表
    AVL树
    C++基础-02
  • 原文地址:https://www.cnblogs.com/lidabo/p/15825788.html
Copyright © 2011-2022 走看看