概述
流媒体,指使用流式传输技术在网络上实时连续播放的媒体格式,如音频、视频等多媒体文件。对于流媒体相关开发来说,无外乎是对音视频的采集、渲染、处理和输出。而音视频则是流媒体的核心。本文将对音视频中的一些术语名词等进行简要介绍。
1、音视频组成
我们常见的视频文件如mp4,flv,avi,rmvb等视频文件,可以看成是一个容器。我们常说的视频格式,指容器格式。这些容器封装了音频、视频和基础元信息(Meta Data)等。而容器里封装的音视频也是经过不同的编码格式压缩过的。例如,一个经过H264视频编码后的文件和一个MP3音频编码文件按AVI封装标准封装后就得到一个AVI后缀的视频文件。
2、视频容器格式
MP4
ISO和IEC两个组织下属的MPEG(动态图像专家组)制定的格式。非常开放,几乎可以描述所有媒体结构。支持流媒体,被广泛用于H.264和H.265视频和ACC音频,高清视频常用格式。
AVI
Audio Video Interleaved,微软对抗苹果QuickTime的产物。可跨平台使用,但体积庞大,亚索标准不统一。
FLV
Flash Video,目前最流行的流媒体格式,文件体积小,封装播放简单,非常适合在网络场景下使用,常用于各大视频网站。
WebM
谷歌退出的转为Web设计的开放媒体文件格式。包含使用VP8或VP9视频编解码器压缩的视频流和用Vorbis或Opus音频编解码器压缩的音频流。
MOV
QuickTime中常见格式,兼容性强。
3、视频编码格式
- Xvid(MPEG4)
- H264
- H263
- MPEG1,MPEG2
- AC-1
- RM,RMVB
- H265
目前最常用的编码格式基本是H264,优点是低码率,高质量,容错能力强,网络适应性强。
H265目前使用还不多,它是用来替代H264的标准,支持更高分辨率,但浏览器支持较差。
4、音频编码格式
- AAC
- AMR
- PCM
- OGG
- AC3
- DTS
- APE
- AU
- WMA
目前最常见的音频格式是MP3和ACC,ACC的编码方案对比MP3优势更大。
5、视频码率、帧率、分辨率
码率
码率、码流、比特率是一个东西,又称二进制位速率。单位bit/s或bps,kbps,Mbps等。码率是视频编码中画面质量控制中最重要的部分,通常同分辨率下,码率越大,压缩比就越小,画面质量就越高。码率越高,代表单位时间采样率越大,数据精度高,越接近原始文件,画质更清晰,但对播放设备的解码能力要求也就越高,文件体积也越大。
文件体积 = 时间 * 码率 / 8
例如,一部90分钟1Mbps码率的720P RMVB文件,它的体积是5400 * 1 / 8 = 675MB。
通常,一个视频文件包括视频和音频,视频和音频都有各自不同的采样方式和比特率。而我们常说的一个视频文件的码率大小,一般是指视频文件里音视频码率的和。
帧率
FPS(Frames Per Second),和游戏中的FPS一个概念。高帧率可以得到更流畅的效果。帧率越高,对CPU消耗也越大。
通常普通视频15-20fps,电影常用24fps。由于人眼视觉暂留效应,一般超过12fps就可以认为流畅(仅对视频而言)
分辨率
视频中图像的尺寸大小。例如720P是1280*720个像素点,1080P是1920*1080个像素点。
6、图像存储,RGB和YUV
视频由一张张图片组成,视频的文件大小也直接受图片大小和数量影响。那么影响一张图片大小的因素有哪些?这就需要了解色彩空间和图像编码。
RGB
RGB是我们非常熟悉的一种颜色空间。RGB模型使用三原色亮度来定量表示颜色,这是一种加色混色模型,适用于显示器等发光体的显示,几乎人眼所能看到的所有颜色都可以用RGB表示。传统RGB三原色表示一个像素,每种原色占用一个字节,一个像素则需要3字节。
YUV
YUV(又称YCrCb)是被欧洲电视系统采用的一种颜色编码方法,和RGB区别很大。YUV模型根据一个亮度分量Y和两个色度分量UV(分别表示色调和饱和度)来定义颜色。它最大的优点在于只需要占用极少的带宽(RGB要求三个独立的视频信号同时传输),同时由于Y和UV是分离的,当只有Y分量时表现的图像就是黑白灰度图像,这样完成了彩色电视机和黑白电视机的兼容问题,黑白电视得以接收彩色电视信号。
YUV格式分为两大类:planar和packed。planar是先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。而packed格式则交替存储每个像素点的YUV分量。
YUV常见的几种编码格式有YUV444,422,420和411,其中YUV420最常用。它们的含义如下。
- YUV444:YUV三个分量采样率相同,每个像素的三个分量信息完整,一个像素占用3字节。
- YUV422:每两个Y分量公用一个UV分量,一个像素占用2字节。
- YUV420:每四个Y分量公用一个UV分量,一个像素占用1.5字节。
- YUV411:每四个Y分量公用一个UV分量,一个像素占用1.5字节。
通过对YUV分量比例和排列顺序和位置的不同,实际上可以分为很多种格式,例如安卓相机默认图像格式属于YUV420SP。但显而易见,YUV带来的好处很多,通过减少UV分量可以显著减少每个像素占用的空间,这是因为人眼对色度的敏感程度低于对亮度的敏感程度。相对于RGB而言YUV编码可以节省很大空间。
一幅图像大小
一张图像所占字节大小 = 分辨率 * 二进制颜色位数 / 8
其中二进制颜色位数由色彩编码格式决定。例如RGB24的量化位数是24位,RGB32是32位,YUV420是12位。也可以直接转化为字节计算,例如一帧1024*768分辨率采用YUV422编码的图像数据流大小为1024*768*2=1572864字节,就是1.5MB大小。
7、音频采样
声是一种波,频率决定音调,振幅决定音量。对音频的采样就是对波的采样,即记录波弦上的点。波是无限光滑的,显然不可能记录波上所有的点。因此采样就牵涉到采样频率和采样精度。如果你对HIFI感兴趣,可能知道常用采样频率22.05KHz,44.1KHz,48KHz甚至96KHz和192KHz;而采样精度通常有16bit或24bit。采样频率越高,精度越大,对声音的记录就越真实。
人耳能听到的声音频率范围是20Hz-20KHz,根据奈奎斯特采样原理,按比声音最高频率高两倍以上的频率对声音采样,一般采样率就是44.1KHz,即1秒钟内采样44100次。采样精度则类似于图片中的图片深度。如果用笛卡尔直角坐标系表示一个声波,采样频率对应横轴精度,采样精度对应纵轴精度。显然对音频是不可能完全真实记录的,就像无法用有限数字表达圆周率一样,但可以做到非常接近,被称为高保真,这也是HIFI里非常重要的概念。现实中,能达到最高保真水平的就是PCM编码,约定俗成称之为无损编码,但这种无损只是相对的。而MP3,ACC相对就称为有损格式。
码率(bps)=采样频率*采样精度*声道数
对于一个PCM音频流来说码率比较容易算。一个采样率44.1KHz,采样精度16bit,双声道的PCM编码的WAV文件,码率是44.1k*16*2=1411.2kbps,即码率。码率/8得到176KB/s,表示每秒传输数据带宽。这样一分钟音乐大概需要10.34MB,这对很多用户是不可接受的,所以有了各种压缩方案。
8、IBP帧,IDR帧和GOP
I帧
I帧即关键帧,可以看作一帧画面的完整保留,压缩比和JPEG差不多,I帧的压缩可以去掉空间的冗余信息。
- 是一个全帧压缩编码帧。它把全帧图像信息进行JPEG压缩编码及传输
- 解码时仅用I帧数据就可以重构完整图像
- I帧描述了图像背景和运动主体的详情
- I帧不需要参考其他画面生成
- I帧是P帧和B帧的参考帧,它的质量直接影响到同组里以后各帧质量
- I帧是帧组GOP的基础帧(第一帧),一组中只有一个I帧
- I帧不需要考虑运动矢量
- I帧所占数据信息量比较大
P帧
P帧(predictive-frame):前向预测编码帧(预测帧)。通过将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码帧,是以I帧为参考帧,在I帧中找到P帧‘某点’的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出‘某点’预测值并与差值相加得到P帧‘某点’样值,从而得到完整的P帧。
- P帧是I帧后相隔1-2帧的编码帧
- P帧使用运动补偿方法传送它与前面的I或P帧的差值和运动矢量
- 解码时必须将I帧中的预测值和预测误差求和后才能重构完整的P帧图像
- P帧属于前向预测的帧间编码,它只参考前面最靠近它的I帧或P帧
- P帧可以是其后面P帧的参考帧,也可以是其前后B帧的参考帧
- P帧是参考帧,它可能造成解码错误的扩散
- 由于是差值传送,P帧压缩比较高
B帧
B帧(bi-directional interpolated prediction frame):双向预测内插编码帧(双向预测帧),既考虑与源图像序列前面已编码帧,也顾及图像序列后面已编码帧间的时间冗余信息来压缩传输数据量的编码帧,是以前面的I或P帧和后面的P帧为参考帧,找出B帧中某点预测值和两个运动矢量,并取预测值和运动矢量传送。接收端根据运动矢量在两个参考帧中算出预测值并与差值求和,得到B帧某点样值,从而得到完整B帧。
- B帧由前面的I或P和后面的P来预测
- B帧传送的是它和前面的I或P和后面的P帧间的预测误差和运动矢量
- B帧是双向预测编码帧
- B帧压缩比最高,预测比较准确
- B帧不是参考帧,不会造成编码错误的扩散
- 运算量多,因此对硬件要求高
IDR帧
IDR(Instantaneous Decoding Refresh):即时解码刷新。I帧和IDR帧都是使用帧内预测的,它们都是同一个东西,在编解码中为了方便,将首个I帧和其他I帧区别开,就把第一个I帧称为IDR。作用是立刻刷新,使错误不至于传播,从IDR开始重新算一个新的序列进行编码。对IDR帧来说,它之后的所有帧都不能引用任何它之前的帧内容。播放器永远可以从一个IDR帧播放,因为它后边没有任何帧引用之前的帧。
DTS
Decode Time Stamp,解码时间戳,标识读入内存中的bit流什么时候开始送到解码器里进行解码,在解码阶段使用。
PTS
Presentation Time Stamp,用于度量解码后的视频帧什么时候显示出来,主要用于视音频的同步和输出。
GOP
Group Of Picture,是两个I帧间形成的一组图片。可以设置两个I帧之间的帧数量。
一般来说,I帧压缩略是7,和JPG差不多;P是20;B可以达到50。所以B帧可以节省大量空间,节省出的空间可以用来多保存一些I帧,这样在相同码率下可以提供更好的画质。在码率不变的前提下GOP值越大,P、B帧数量越多,平均每个I、P、B帧所占字节数就越多,也更容易获取较好的图像质量。
如果一个GOP里丢失了I帧,那么后面的PB帧就没用了,必须丢掉。但TCP协议会保证通常I帧不会丢失,UDP也会有更多策略保证I帧正确传输。
9、编解码
软编解码
如H264,H265,MPEG-4等编解码算法,更消耗CPU
硬编解码
由于高清视频的出现,编解码逐渐让CPU感到吃力。人们发现这种大数据量低难度的重复工作更适合让GPU干,称为硬编解码。实际上没有纯粹的硬编解码,只是其中大量运算的主力从CPU变为GPU。
10、流媒体传输协议
常见流媒体协议包括HTTP渐进下载和基于RTMP/RTP的实时流媒体协议,这两种是完全不同的东西。直播中常见流媒体协议包括RTMP,HLS,HTTP FLV等。
RTMP
Real Time Messaging Protocol,实时消息传送协议是Adobe为Flash播放器和服务器间音视频传输开发的开放协议。基于TCP实现,一般延迟在1-3s左右。
HLS
HTTP Live Streaming是苹果实现的基于HTTP的流媒体传输协议,可实现流媒体直播和点拨。HLS点播基本上就是常见的分段HTTP点播,不同的是它分段很小。基本原理就是把视频流切片成TS,并建立M3U8索引。相对于RTMP、RTSP等,HLS的客户端获取的并不是一个完整数据流,而是不断的下载并播放切片。这种特点决定了它的延迟一般高于普通的流媒体直播协议。
HTTP-FLV
基于HTTP长连接,和RTMP一样,每个时刻的数据收到后都会立刻转发,只是使用的是HTTP协议,一般延迟在1-3s
11、WebRTC
网页即时通讯技术Web Real-Time Communication是谷歌的一个实时通讯解决方案,它通过浏览器实现音视频的采集和播放,可以通过建立的通道进行音视频的数据共享,被纳入W3C推荐标准,被主流浏览器支持。详细介绍会在之后发出。