zoukankan      html  css  js  c++  java
  • 8.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 文件体积庞大,不能在网络上很好的使用等缺点。


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

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

     

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

    视频解码

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

    音频解码

    • 将音频码流(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格式.从而占用极少的存储数据.

        如下图所示,黑点表示该像素点的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区别

    • 对于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 转换成 YUV

    • 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 转换成 RGB

    • 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;


    下章学习:9.下载ffmpeg、使QT支持同时编译32位和64位


  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/lifexy/p/13647953.html
Copyright © 2011-2022 走看看