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;
  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/lidabo/p/15825788.html
Copyright © 2011-2022 走看看