上篇:
音视频开发基础理论-音频篇
- 视频是怎么形成的?
- 视频是如何播放的?
- mp4和mkv等有什么区别?
- H.264是什么?
- ...
带着这些疑问,我们一起来看看视频相关的知识;
颜色
颜色是通过眼、脑和我们的生活经验所产生的一种对光的视觉效应
颜色就是人对光的一种感觉,由大脑产生的一种感觉
人类肉眼由视锥细胞及视杆细胞组成,它们共同影响眼睛对不同频率的光的感知程度的不同,对不同亮度的感知程度的不同;
- 视锥细胞:视网膜的中央,对红、绿、蓝三种光敏感,可以识别色度;
-
视杆细胞:分散分布在视网膜上,对环境的分辨能力(比如夜里看到物体的黑白轮廓),可以识别亮度;
自然界中的任一颜色都可以由红,绿,蓝 这3 种颜色值之和来确定,这即是三原色,可以选择不同的三原色构造不同的颜色空间。
颜色模型
选定三原色,并且对三原色进行量化,那就可以将人的颜色知觉量化为数字信号;
常见的颜色模型:
RGB
RGB模型是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各种颜色的;
使用8位的二进制, 可以表示 2^8 =256种色彩。
使用16位的二进制,可以表示 2^16 =65536种色彩。
使用24位的二进制,可以表示 2^24 =16777216种色彩。CMYK、CMY
用于印刷出版。CMYK表示青(Cyan)、品红(Magenta)、黄(Yellow)、黑(BlacK)四种颜料HSL、HSV
色相(Hue)、饱和度(Saturation)、亮度(Lightness/Luminance/Intensity)YUV
主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视;
类似于RGB,YUV由Y、U、V三个分量组成:
Y表示明亮度(Lumina nce或Luma),也就是灰阶值;U和V表示的是色度(Chrominance或Chroma),描述影像色彩及饱和度,用于指定像素的颜色。
YUV详解
黑白电视的时候,基本上只需要一路信号就可以还原图像(亮度)。但是有了彩色之后,一路信号无法表达一副完整的彩色图像(亮度+色度);
彩色电视出现之后,为了兼容早期的黑白电视信号(也就是黑白电视机可以接收彩色信号,但是只显示黑白),科学家引入了YUV色彩表示法。
现在通常说的YUV指的是YCbCr:
其中Y与YUV 中的Y含义一致,Cb , Cr同样都指色彩,只是在表示方法上不同而已,Cb Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写),Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。
YUV的诞生一开始是考虑到黑白电视兼容,但是目前黑白电视基本淘汰,YUV色彩何以延续至今呢?
最主要的原因不是因为兼容性考虑,而是YUV有个巨大的优势,就是节省带宽。这在数字媒体领域是很重要的。
对比RGB,使用YUV一个像素可以减小至平均只占用12bit(1.5字节);体积是RGB888的一半;
在体积减少的情况,给与人肉眼的感觉其实区别并不大;
这是由于人类视网膜上的视杆细胞要多于视锥细胞,视网膜杆细胞的作用就是识别亮度,而视网膜锥细胞的作用就是识别色度。所以人眼对亮度分辨率的敏感度高于对色彩分辨率的敏感度;
YUV颜色模型就是利用这个原理,把亮度与色度分离,根据人眼对亮度更敏感,增加亮度的信号,减少颜色的信号,以此来节省空间,从而适合于图像处理领域。
我们更容易识别去除色彩的图像,而对于单独剥离出的只有色彩的图像,不好识别:
总结一下YUV的优点:
- 兼容性更好,可以兼容黑白色彩;
- 体积更小,适合于图像处理领域;
YUV采样格式
采样格式通常用A:B:C的形式来表示,比如4:4:4、4:2:2、4:2:0等;
其中常用的是4:2:0。
A:一块A*2个像素的概念区域,一般都是4
B:第1行的色度采样数目
C:第2行的色度采样数目
C的值一般要么等于B,要么等于0
- 4:4:4
每1个像素都有自己独立的1组CbCr分量,1个像素占用24bit(3字节)
- 4:2:2
水平方向相邻的2个像素(1行2列)共用1组CbCr分量,1个像素平均占用16bit(2字节)
- 4:2:0
相邻的4个像素(2行2列)共用1组CbCr分量,1个像素平均占用12bit(1.5字节)
视频相关概念
- 视频
连续的图象变化,每秒超过24帧(Frame)画面时,根据视觉暂留原理,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的画面叫做视频; - 帧(Frame):
是视频常用的最小单位,相当于电影中胶片的每一格镜头,一帧就是一副静止的画面,连续的帧就形成了视频。 - 帧速率(FPS):
每秒钟所包含的帧数量,也可以理解为处理器每秒刷新的次数,帧数越高,画面也就越流畅。 - 场
过去电视荧光屏扫描是隔行扫描,每两次扫描才产生一副图像,而每次扫描就叫做1场。也就是说每2场扫描生成1帧画面。 - 比特率
表示单位时间(1秒)内传送的比特数,一般我们用的单位是kbps,其意思是 Kilobits per second
视频的采样
视频最早是由摄像机拍摄制作而成的;
现实中摄像机的成像原理都是基于小孔成像为基础的。
我们知道,光在同一均匀介质中、不受引力作用干扰的情况下,沿直线传播;因此它在遇到阻隔物上的孔洞时会穿过它,并能在孔后一定距离内的对应平面上投射出一个倒立的实影;只要投影面周围的环境足够暗,影像就能被人眼所观看到。
摄像机的基本工作原理就是——将景物影像通过光线的各种传播特性准确地聚焦在具有感光能力的感光器件上;这种感光器件上面覆盖了一层含三基色的马赛克滤镜;一片感光器件来采集三种颜色,感光器件是对光敏感的设备,对于进光三种颜色的强弱可以产生不同的电压;将这些不同的电压记录下来并转换为数字信号(RGB或YUV等表示),在进行压缩存储即得到视频数据;
视频分辨率
分辨率是用于度量图像内数据量多少的一个参数,通常表示成ppi(每英寸像素Pixel per inch), 视频的320X180是指它在横向和纵向上的有效像素
视频分辨率也是数字化视频时代的主要特征,由于模拟视频采用线扫描机制,也就是按行显示图像,而每一行的视频线中并没有进行数字量化,所以模拟视频都是以多少行来界定的。比如PAL制式采用576行,NTSC制式采用480行。
到了数字化时代,为了量化视频的具体信息,就必须对每行的信息进行采样并量化,就形成了分辨率的概念。如果采用PAL制式的视频,每行量化的图像点为768个,那么分辨率就是768×576。也就是说把PAL制的视频图像可以分解为768×576个像素点组成。
在标清电视时代,对于分辨率方面理解与现在其实有所不同。比如SECAM制式每帧图像是625行,但是分辨率是720×576,也就是只有576行。是因为视频信号传输过程中分帧正程和帧逆程,而帧逆程就是回扫,反向回去。在视频信号正常显示时,需要消除行帧逆程扫描对画面的干扰,所以就变成了576行。
到了高清时代,数字电视推出了HDTV标准,它对于显示分辨率的定义为1280×720逐行扫描,也就是俗称的720P;1920×1080隔行扫描,也就是俗称的1080i;1920×1080逐行扫描,也就是所谓的1080P。
当然高清数字电视已经逐渐普及了,目前正在面向4K高清过渡,也就是所谓的UHDTV(Ultra High Definition Television,超高清数字电视)。UHDTV草案定义了两个分辨率标准,及4K(3840×2160)和8K(7680×4320),支持50Hz、60Hz、和59.94Hz三种帧率,只采用逐行扫描。UHDTV采用正交采样,像素纵横比(PAR)为1:1,显示纵横比(DAR)为16:9。
视频编解码
视频编码:
按照YUV色彩表达方式,采样格式4:2:2,720×1280的分辨率,每秒30帧画面的视频。经过简单的计算,1分钟视频大小=720x1280x2x30x60=3G;
可见采集的原始视频信号体积都非常大,如果视频不经过压缩编码的话,占用存储太大不利于保存及传输。
视频编码就是文件当中的视频所采用的压缩算法,视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。
视频解码:
有了编码,当然也需要有解码。
因为压缩(编码)过的内容无法直接使用,使用时必须解压缩,还原为原始的信号(比如视频中某个点的颜色等),这就是“解码“或者”解压缩“。
H.264
目前所有的视频压缩编码格式:
现在几乎都是被H.264统一了市场,因此着重了解下H.264;
H.264(MPEG-4 Part 10,Advanced Video Coding),
是迄今为止视频录制、压缩和分发的最常用格,H.264提供了明显优于以前任何标准的压缩性能。
其编码过程大体可以归纳为以下几个主要步骤:
- 划分帧类型
- 帧内/帧间编码
- 变换 + 量化
- 滤波
- 熵编码
帧内(Intraframe)编码:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩时各个帧之间没有相互关系,所以压缩后的视频数据仍可以以帧为单位进行编辑。帧内压缩一般达不到很高的压缩。
帧间(Interframe)编码:基于许多视频或动画的连续前后两帧具有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
具体参考: https://www.cnblogs.com/mjios/p/14768991.html
视频封装格式:
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。有了封装格式,才能把字幕,配音,音频和视频组合起来。常见的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件都指的是一种封装格式。
流行的封装格式如下所示:
视频播放
播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步;
播放本地文件则不需要解协议,需要经过以下几个步骤:解封装,解码视音频,视音频同步;
解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码:将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3等,视频的压缩编码标准则包含H.264,MPEG2等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV、RGB等;压缩编码的音频数据输出成为非压缩的音频抽样数据,如PCM数据。
音视频同步:同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
音视频同步的目的是为了使播放的声音和显示的画面保持一致。
视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧;
音频按采样点播放,声音播放设备每次播放一个采样点,声音播放速度由采样率确定,采样率指示每秒播放多少个采样点。
如果仅仅是视频按帧率播放,音频按采样率播放,二者没有同步机制,即使最初音视频是基本同步的,随着时间的流逝,音视频会逐渐失去同步,并且不同步的现象会越来越严重。
这是因为:一、播放时间难以精确控制,二、异常及误差会随时间累积。所以,必须要采用一定的同步策略,不断对音视频的时间差作校正,使图像显示与声音播放总体保持一致。
音视频同步的方式基本是确定一个时钟(音频时钟、视频时钟、外部时钟)作为主时钟,非主时钟的音频或视频时钟为从时钟。在播放过程中,主时钟作为同步基准,不断判断从时钟与主时钟的差异,调节从时钟,使从时钟追赶(落后时)或等待(超前时)主时钟。
按照主时钟的不同种类,可以将音视频同步模式分为如下三种:
音频同步到视频,视频时钟作为主时钟;
视频同步到音频,音频时钟作为主时钟;
音视频同步到外部时钟,外部时钟作为主时钟;
根据人耳朵和眼睛生理构造因素,得出一个结论,那就是人的耳朵要比眼睛敏感的多,也就是说如果音频有跳帧行为则人的耳朵很容易分辨出来,如果视频画面有跳帧行为或者重复渲染人的眼睛则不容易分辨出来。根据这理论在做视频播放器的时候可以选择的音视频对齐策略是 视频同步到音频,音频时钟作为主时钟