视频编码压缩基本:
视频是什么?视频是连续的图片,以时间为x轴;
衡量视频的指标:帧率:FPS:Frame per second,即每秒画面数量,帧率越高,越流畅视频的存储和传输:
没有经过编码压缩的视频,是一个图片一个图片构成的,那么:
一个视频,如果未经编码,它的体积是非常庞大的。以一个分辨率1920×1280,帧率30的视频
为例。1920×1280=2,073,600(Pixels 像素)每个像素点是24bit(前面算过的哦)也就是每幅
图片2073600×24=49766400bit 8 bit(位)=1 byte(字节),所
以,49766400bit=6220800byte≈6.22MB。这是一幅1920×1280图片的原始大小,再乘以帧率
30,也就是说,每秒视频的大小是186.6MB,每分钟大约是11GB,一部90分钟的电影,约是
1000GB。。。如果按照100M的网速(12.5MB/s),下刚才那部电影,需要22个小时视频的压缩(编码):编码就是为了压缩,即把原视频格式文件转换成另外一种格式文件
编码的方式,如何压缩:
采集设备采集一帧图像会生成无损的**.bmp文件格式的图片文件,一个6M通过有损压缩得到200kb的JPEG文件,压缩比就是1/30。
但是视频不需要单独传输一张张压缩图,只需要记录每帧之间的差别即可。于是,根据I帧(200K原始图像)生成差异文件P帧,通过I帧和P帧再生成B帧。
这,就是H.264编码。
编码压缩就像魔术一般,一段视频,如果经过编码压缩后,可以大幅度的缩小体积。而各种不同的压缩算法就是编码格式**,如今主流的音视频编码格式就是H.264+AAC,视频内容经过编码压缩大幅度的减少体积后,有利于存储和压缩。但是相应的,传输时也是被压缩算法所“加密”的视频。所以,在播放端也需要一个“解密”的过程。 因此,在编码和解码之间,显然需要一个编码器和解码器都可以理解的约定,就图像而言:生产端的编码器将多张图像进行编码后生成一段端的GOP(Group of pictures), 播放端的解码器则是读取一段段的GOP解码后读取画面再渲染显示。
举个例子,如果一幅图(1920×1080分辨率),全是红色的,我有没有必要说2073600次[255,0,0]?我只要说一次[255,0,0],然后再说2073599次“同上”,即去除冗余信息:冗余信息和编码:
- 视频编码优先消除空间冗余和时间冗余:
空间冗余:即一张图片的重复信息
时间冗余:即图片和图片之间的重复信息;
于是出现了I,P,B帧的策略;
- I,P,B帧:
视频是由不同的帧画面连续播放形成的;这些帧,分为三类,即I帧,P帧,B帧:
I帧:是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是I帧
P帧:帧间预测编码帧”,需要参考前面的I帧和/或P帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。但是,P帧压缩率比较高,占用的空间较小
B帧:“双向预测编码帧”,以前帧和后作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)
- 视频中图像的切块:
即并不是按照一张图片(比如分辨率为1920*1080)而是把图像切割为不同的“块(Block)”或“宏块(MacroBlock)”,对它们进行计算。一个宏块一般为16像素×16像素
帧内和帧间,即上面提到的空间冗余去除和时间冗余去除:
帧内处理:
IDR帧,PTS,DTS,GOP:
IDR:把第一个首个I帧叫IDRPTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的.衡量编码的效果:信噪比/峰值信噪比;客观人眼评价
一个视频的采集,编码解码过程:
视频编码相关标准组织:
- ITU(国际电信联盟)
- ISO/IEC:
ISO和IEC联合成立了一个专家组,负责开发电视图像数据和声音数据的编码、解码和它们的同步等标准。这个专家组,就是大名鼎鼎的MPEG,Moving Picture Expert Group(动态图像专家组) - ITU和ISO/IEC的关系:
ITU提出了H.261、H.262、H.263、H.263+、H.263++,这些统称为H.26X系列,主要应用于实时视频通信领域,如会议电视、可视电话等。
ISO/IEC提出了MPEG1、MPEG2、MPEG4、MPEG7、MPEG21,统称为MPEG系列。
ITU和ISO/IEC一开始是各自捣鼓,后来,两边成立了一个联合小组,名叫JVT(Joint Video Team,视频联合工作组)。
视频加音频:封装技术:
只有视频,则是无声的,所以需要加上音频才完整:
封装,就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。
目前主要的视频容器有如下:MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。
互联网视频播放过程:
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来
流媒体传输协议:
区分于视频封装,即视频文件,流媒体传输的是视频,但是不是以视频文件容器的形式传递的,除非下载整个视频文件,但这时也会封装更多的数据,以便于传输;
所以流媒体传输协议就是为了便于网络传输(带宽,网络复杂性等),将视频数据和音频数据,以一定的格式和头,控制信息等封装起来形成一个包,并载于tcp/udp上传输的协议;
流媒体传输会存在两种需求:顺序流式传输(progressive streaming)和实时流式传输(real time streaming)。
从本质上讲,直播就是一帧帧的数据加上时序标签流式传输。 这里有个悖论:一个容器封装好后的视频是“结构化”的,即不可变的,那直播又是怎么产生的呢?或者说,怎么去打破这个已经产生的“结果”,从而还往里面加上时序标签流式传输的呢? 很简单,那就是**“边生产边传输边播放”
- 所以在直播流中,为了保证一些特性:比如音视频同步,实时播放等,需要做一些处理:
- 传输中音画同步dts
2)传输中实时携带解码信息,比如每个I帧都带视频头等;
3)本地保存流头,在拉流时先下发头;
顺序传输和实时传输:
顺序流式传输(progressive streaming)的特点:期望音视频数据无错误无丢失顺序的从一端传输到另一端,
例如警方对视频监控录像回放取证、网络电影播放等都需要数据正常到达然后解码播放,
对于这种情况一般采用可靠的 tcp 方式传输。实时流式传输(real time streaming)的特点:期望音视频数据实时的的从一段传输到另一端,
例如数字电视行业的电视直播,由于 tcp 的包确认机制的开销大,基于窗口的拥塞控制技术不
太适应稳定的流媒体传输,tcp 重传机制对实时流没有必要,对于这种情况一般采用 udp 方式传输。解决方案为:http(基于 tcp)做控制信息的传输,rtp(基于udp)做实时数据流的传输;http live streaming (hls) 码流自适应也可作为实时流传输的解决方案
直播就是将每帧数据(Video/Audio/Data Frame(元信息)),打上时序标签后进行流式传输的过程。
发送端源源不断的采集音视频数据,经过编码、封包、推流,再经过中继分发网络进行扩散传播。
播放端则源源不断的下载数据并按时序进行解码播放。 这样就完成了“边生产、边传输、边播放”的直播过程了。
简而言之,视频直播技术,就是将视频内容的最小颗粒(I/P/B帧),基于时序标签,以流式传输的一种技术。PS:GOP越长,所包含的B帧和P帧越多,响应的压缩比也会更高。
GOP越短,I帧比例增高,压缩比增加,同码率下视频质量会下降。
下载视频,点播,边下边播,直播;
从流媒体传输的方式看,有:
渐进式下载:即边下边播:属于本地播放
单纯文件下载:属于本地播放点播即在线播放:索引文件包含所有切片下载地址,依次下载切片文件。建立一个Connection,边下边播,实时传输
直播中的关键词:
码率,转码等
流媒体相关协议:
FLV,RTMP,HLS,RTP,RTCP等。
- 直播:实时更新索引文件,根据索引文件下载切片文件建立一个Connection,边放边播,实时更新流。