[TOC]算法
是什么促使我要写这一篇音视频&流媒体门的初级文章?那是由于和一妹子打赌码率的概念,结果输了;对一个技术人员而言,码率这个种最基本的几率都没整明白,简直是奇耻大辱,开个玩笑。有了这个前提以后,发现,仍是得多理解下原理和基础入门知识。缓存
当下,音视频、流媒体已经无处不在,直播已经火了几年,在后续的时间里面,人们聊天已经不只仅知足与文字、而是更多的在于“类面对面”交流,可以实时感知对方的表情、动做。为此,有必要跟紧时代潮流,好好梳理梳理流媒体这门功课。服务器
流媒体是什么?流媒体就是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。流媒体技术也称流式媒体技术。那么音视频就是流媒体的核心。微信
一个完整的视频文件,包括音频、视频和基础元信息,咱们常见的视频文件如mp四、mov、flv、avi、rmvb等视频文件,就是一个容器的封装,里面包含了音频和视频两部分,而且都是经过一些特定的编码算法,进行编码压缩事后的。网络
H26四、Xvid等就是视频编码格式,MP三、AAC等就是音频编码格式。例如:将一个Xvid视频编码文件和一个MP3音频编码文件按AVI封装标准封装之后,就获得一个AVI后缀的视频文件。架构
所以,视频转换须要设置的本质就是tcp
一个完整的视频转换设置都至少包括了上面3个步骤。工具
音频编码格式有以下性能
音频编码方案之间音质比较(AAC,MP3,WMA等)结果: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3优化
目前最多见的音频格式有 Mp三、AC-三、ACC,MP3最普遍的支持最多,AC-3是杜比公司的技术,ACC是MPEG-4中的音频标准,ACC是目前比较先进和具备优点的技术。对应入门,知道有这几种最多见的音频格式足以。
视频编码标准有两大系统: MPEG 和ITU-T,国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.26一、H.26三、H.263+、H.264等,另外一个是“国际标准化组织(ISO)”它制定的标准有MPEG-一、MPEG-二、MPEG-4等。
常见编码格式有:
目前最多见的视频编码方式的大体性能排序基本是: MPEG-1/-2 < WMV/7/8 < RM/RMVB < Xvid/Divx < AVC/H.264(由低到高,可能不彻底准确)。
在H.265出来以前,H264是压缩率最高的视频压缩格式,其优点有:
H.264最大的优点是具备很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小若是为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的做用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤为值得一提的是,H.264在具备高压缩比的同时还拥有高质量流畅的图像,正由于如此,通过H.264压缩的视频数据,在网络传输过程当中所须要的带宽更少,也更加经济。
目前这些常见的视频编码格式实际上都属于有损压缩,包括H264和H265,也是有损编码,有损编码才能在质量得以保证的前提下获得更高的压缩率和更小体积
目前市面常见的存储封装格式有以下:
AVI : 可用MPEG-2, DIVX, XVID, WMV3, WMV4, AC-1, H.264 WMV : 可用WMV3, WMV4, AC-1 RM/RMVB : 可用RV40, RV50, RV60, RM8, RM9, RM10 MOV : 可用MPEG-2, MPEG4-ASP(XVID), H.264 MKV : 全部
码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,通常咱们用的单位是kb/s或者Mb/s。通常来讲一样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内采样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。
固然,码率越大,文件体积也越大,其计算公式是文件体积=时间X码率/8。例如,网络上常见的一部90分钟1Mbps码率的720P RMVB文件,其体积就=5400秒×1Mbps/8=675MB。
一般来讲,一个视频文件包括了画面(视频)及声音(音频),例如一个RMVB的视频文件,里面包含了视频信息和音频信息,音频及视频都有各自不一样的采样方式和比特率,也就是说,同一个视频文件音频和视频的比特率并非同样的。而咱们所说的一个视频文件码流率大小,通常是指视频文件中音频及视频信息码流率的总和。
帧率也称为FPS(Frames Per Second)- - - 帧/秒。是指每秒钟刷新的图片的帧数,也能够理解为图形处理器每秒钟可以刷新几回。越高的帧速率能够获得更流畅、更逼真的动画。每秒钟帧数(FPS)越多,所显示的动做就会越流畅。
关于帧率有以下几个基础数据:
视频分辨率是指视频成像产品所成图像的大小或尺寸。常见的视像分辨率有352×288,176×144,640×480,1024×768。在成像的两组数字中,前者为图片长度,后者为图片的宽度,二者相乘得出的是图片的像素,长宽比通常为4:3.
480P : 640 x 480 个像素点 720P : 1280 x 720 个像素点 1080P : 1920 x 1080 个像素点
而后还须要关注每一个像素点的存储格式,每一个像素点占用的字节大小。
一、宽:一行有多少个像素点。 二、高:一列有多少个像素点,一帧有多少行 三、YUV格式仍是RGB格式? 四、一行多少个字节?? 五、图像大小是多少? 六、图像的分辨率多少?
说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少。一幅1920x1080像素的YUV422的图像,大小是1920X1080X2=4147200(十进制),也就是3.95M大小。这个大小跟多少个像素点和数据的存储格式有关。
YUV格式,与咱们熟知的RGB相似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息同样能够显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。而且,YUV不像RGB那样要求三个独立的视频信号同时传输,因此用YUV方式传送占用极少的频宽。
YUV格式有两大类:planar和packed。对于planar的YUV格式,先连续存储全部像素点的Y,紧接着存储全部像素点的U,随后是全部像素点的V。对于packed的YUV格式,每一个像素点的Y,U,V是连续交替存储的。
YUV,分为三个份量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),做用是描述影像色彩及饱和度,用于指定像素的颜色。 YUV是利用一个亮度(Y)、两个色差(U,V)来代替传统的RGB三原色来压缩图像。传统的RGB三原色使用红绿蓝三原色表示一个像素,每种原色占用一个字节(8bit),所以一个像素用RGB表示则须要8 * 3=24bit。
若是使用YUV表示这个像素,假设YUV的采样率为:4:2:0,即每个像素对于亮度Y的采样频率为1,对于色差U和V,则是每相邻的两个像素各取一个U和V。对于单个的像素来讲,色差U和V的采样频率为亮度的一半。若有三个相邻的像素,若是用RGB三原色表示,则共须要占用:8 * 3 * 3 = 72bits;若是采用YUV(4:2:0)表示,则只须要占用:8 * 3(Y)+ 8* 3 * 0.5(U)+ 8 * 3 * 0.5(V)= 36bits。只需原来一半的空间,就能够表示原来的图像,数据率压缩了一倍,而图像的效果基本没发生变化。
那么,具体yuv格式所占用的字节数要怎么算呢 ?
4:4:4 表示色度值(UV)没有减小采样。即Y,U,V各占一个字节,加上Alpha通道一个字节,总共占4字节.这个格式其实就是24bpp的RGB格式了。
4:2:2 表示UV份量采样减半,好比第一个像素采样Y,U,第二个像素采样Y,V,依次类推,这样每一个点占用2个字节.二个像素组成一个宏像素.
4:2:0 这种采样并不意味着只有Y,Cb而没有Cr份量,这里的0说的U,V份量隔行才采样一次。好比第一行采样 4:2:0 ,第二行采样 4:0:2 ,依次类推...在这种采样方式下,每个像素占用16bits或10bits空间.
4:1:1 能够参考4:2:2份量,是进一步压缩,每隔四个点才采一次U和V份量。通常是第1点采Y,U,第2点采Y,第3点采YV,第4点采Y,依次类推。
码率和帧率没有半毛钱关系
码率关系着带宽、文件体积
帧率关系着画面流畅度和cpu消耗
分辨率关系着图像尺寸和清晰度
1,该文件对应的码率就是
2,10M独享带宽能支撑的同时在线人数
3, 支撑1000人同时在线的系统最少须要的带宽数为
41587/10*60 = 69KB/s = 69 * 8 Kb/s = 532Kb/s
那么获得码率就是 532Kb/s
一个音频编码率为128Kbps,视频编码率为800Kbps的文件,其总编码率为928Kbps,意思是通过编码后的数据每秒钟须要用928K比特来表示。
文件大小公式: (音频编码率(KBit为单位)/8 + 视频编码率(KBit为单位)/8)× 影片总长度(秒为单位)= 文件大小(MB为单位)
一帧图像原始大小 = 宽像素 * 长像素 ,固然要考虑数据格式,由于数据格式不同,大小写也不相同,通常数据采用rgb、yuv格式,如rgb3二、yuv420、yuv422等。最经常使用的应当属于yuv420。 所以,计算公式为:
文件的字节数 = 图像分辨率 * 图像量化位数/8 图像分辨率 = X方向的像素数 * Y方向的像素数 图像量化数 = 二进制颜色位数
RGB24每帧的大小是
RGB32每帧的大小是
YUV420每帧的大小是
举例说明,对于一个1024*768的图像实际的YUV422数据流大小就为:1024 *768 * 2 = 1572864bit
一、声道数:声道数是音频传输的重要指标,如今主要有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好, 但立体声数字化后所占空间比单声道多一倍。
二、量化位数: 量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化之后的动态范围。因为计算机按字节运算,通常的量化位数为 8位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所须要的存储空间也越大。
三、采样率:也称为采样速度或者采样频率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样率是指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大,音质越好.
采样率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论( 若是对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号 )。根据该采样理论, CD激光唱盘采样频率为 44kHz,可记录的最高音频为 22kHz,这样的音质与原始声音相差无几,也就是咱们常说的超级高保真音质。通讯系统中数字电话的采用频率一般为 8kHz,与原 4k带宽声音一致的。
比特率(音频) = 采样率 x 采用位数 x 声道数.
以电话为例,每秒3000次取样,每一个取样是7比特,那么电话的比特率是21000。 而CD是每秒 44100次取样,两个声道,每一个取样是13位PCM编码,因此CD的比特率是44100213=1146600,也就是说CD每秒的数据量大约是 144KB,而一张CD的容量是74分等于4440秒,就是639360KB=640MB。
I帧特色:
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一块儿传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以获得P帧“某点”样值,从而可获得完整的P帧。又称predictive-frame,经过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧
P帧特色:
B帧的预测与重构:B帧之前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,获得B帧“某点”样值,从而可获得完整的B帧。 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧
B帧特色:
IDR(Instantaneous Decoding Refresh)--即时解码刷新。
I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其余I帧区别开,因此才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的做用是马上刷新,使错误不致传播,从IDR帧开始,从新算一个新的序列开始编码。而I帧不具备随机访问的能力,这个功能是由IDR承担。IDR会致使DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像必定是I图像,但I图像不必定是IDR图像。一个序列中能够有不少的I图像,I图像以后的图像能够引用I图像之间的图像作运动参考。一个序列中能够有不少的I图像,I图像以后的图象能够引用I图像之间的图像作运动参考。
对于IDR帧来讲,在IDR帧以后的全部帧都不能引用任何IDR帧以前的帧的内容,与此相反,对于普通的I-帧来讲,位于其以后的B-和P-帧能够引用位于普通I-帧以前的I-帧。从随机存取的视频流中,播放器永远能够从一个IDR帧播放,由于在它以后没有任何帧引用以前的帧。可是,不能在一个没有IDR帧的视频中从任意点开始播放,由于后面的帧老是会引用前面的帧。
I帧表示关键帧,你能够理解为这一帧画面的完整保留;解码时只须要本帧数据就能够完成(由于包含完整画面).
P帧表示的是这一帧跟以前的一个关键帧(或P帧)的差异,解码时须要用以前缓存的画面叠加上本帧定义的差异,生成最终画面。(也就是差异帧,P帧没有完整画面数据,只有与前一帧的画面差异的数据).
B帧是双向差异帧,也就是B帧记录的是本帧与先后帧的差异,换言之,要解码B帧,不只要取得以前的缓存画面,还要解码以后的画面,经过先后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,可是解码时CPU会比较累~。
PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧何时被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在何时开始送入解码器中进行解码。
DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的状况下.DTS和PTS的输出顺序是同样的.
两个I frame之间造成一个GOP,在x264中同时能够经过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。若是有B frame 存在的状况下一个GOP的最后一个frame必定是P.
通常平均来讲,I的压缩率是7(跟JPG差很少),P是20,B能够达到50,可见使用B帧能节省大量空间,节省出来的空间能够用来保存多一些I帧,这样在相同码率下,能够提供更好的画质。在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每一个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易得到较好的图像质量。
若是一个GOP里面丢了I帧,那么后面的P帧、B帧也将会无用武之地,所以必须丢掉,可是通常策略会保证I帧不丢(如经过tcp协议保证) ,若是采用UDP,那么也会有更多的策略来保证I帧正确传输。
经过硬件实现编解码,减轻CPU计算的负担,如GPU等
如 H26四、H26五、MPEG-4等编解码算法,更消耗CPU
数据优化和编解码算法息息相关,通常而言
视频帧大小
音频帧大小
经常使用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本是彻底不一样的东西
CDN直播中经常使用的流媒体协议包括RTMP,HLS,HTTP FLV
实时传输协议(Real-time Transport Protocol),RTP协议经常使用于流媒体系统(配合RTCP协议),视频会议和一键通系统(配合H.323或SIP),使它成为IP电话产业的技术基础。RTP协议和RTP控制协议RTCP一块儿使用,并且它是创建在UDP协议上的。
实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议的一个姐妹协议。RTCP为RTP媒体流提供信道外控制。RTCP自己并不传输数据,但和RTP一块儿协做将多媒体数据打包和发送。RTCP按期在流多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP所提供的服务质量提供反馈。
RTSP+RTP常常用于IPTV领域。由于其采用UDP传输视音频,支持组播,效率较高。但其缺点是网络很差的状况下可能会丢包,影响视频观看质量。
RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。
它有三种变种:
总结: RTMP协议基于TCP来实现,每一个时刻的数据,收到后马上转发,通常延迟在1-3s左右
HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。HLS点播,基本上就是常见的分段HTTP点播,不一样在于,它的分段很是小。基本原理就是将视频或流切分红小片(TS), 并创建索引(M3U8).
相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不一样在于,直播客户端获取到的,并非一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,由于服务器端老是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。因而可知,基本上能够认为,HLS是以点播的技术方式来实现直播。因为数据经过HTTP协议传输,因此彻底不用考虑防火墙或者代理的问题,并且分段文件的时长很短,客户端能够很快的选择和切换码率,以适应不一样带宽条件下的播放。不过HLS的这种技术特色,决定了它的延迟通常老是会高于普通的流媒体直播协议。
总结: HLS协议基于HTTP短链接来实现,集合一段时间数据,生成ts切片文件,而后更新m3u8(HTTP Live Streaming直播的索引文件),通常延迟会大于10s
HTTP-FLV基于HTTP长链接,通RTMP同样,每一个时刻的数据,收到后马上转发,只不过使用的是HTTP协议,通常延迟在1-3s
CDN架构设计比较复杂。不一样的CDN厂商,也在对其架构进行不断的优化,因此架构不能统一而论。这里只是对一些基本的架构进行简单的剖析。
CDN主要包含:源站、缓存服务器、智能DNS、客户端等几个主要组成部分。
源站:是指发布内容的原始站点。添加、删除和更改网站的文件,都是在源站上进行的;另外缓存服务器所抓取的对象也所有来自于源站。对于直播来讲,源站为主播客户端。
缓存服务器:是直接提供给用户访问的站点资源,由一台或数台服务器组成;当用户发起访问时,他的访问请求被智能DNS定位到离他较近的缓存服务器。若是用户所请求的内容恰好在缓存里面,则直接把内容返还给用户;若是访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站抓取内容,而后再返还给用户。
智能DNS:是整个CDN技术的核心,它主要根据用户的来源,以及当前缓存服务器的负载状况等,将其访问请求指向离用户比较近且负载较小的缓存服务器。经过智能DNS解析,让用户访问同服务商下、负载较小的服务器,能够消除网络访问慢的问题,达到加速做用。
客户端:即发起访问的普通用户。对于直播来讲,就是观众客户端。
弱网优化的策略包括以下:
播放器Buffer
丢帧策略 (优先丢P帧,其次I帧,最后音频)
自适应码率算法
双向链路优化
音频FEC冗余算法(20%丢包率)
在弱网状况下,为了达到更好的体验,可能会采起丢帧的策略,可是丢帧,怎么丢呢?丢音频帧仍是视频帧呢 ? 由于视频帧比较大,而且视频帧先后是有关联的;音频帧很小,关键是音频帧是连续采样的,丢了音频帧,那声音就会明显出现瑕疵。为此,通常的丢帧策略是丢视频帧
在弱网状况下,另一种靠谱的策略是自适应码率算法,经过设置码率降级为多个档次,这样,当网络很差的状况下,经过下降码率进行预测,若是码率下降后,还不够buffer缓冲,那么继续下降一个档次,是一个循环探测的过程,若是再次降级一个档次后,发现buffer缓冲足够了,那么说明当前网络可以适应这个码率,所以就会采起当前码率。同理,升档也是同样的。可是这个属于厂商的核心算法,
简单估算一下大概的网络延时。众所周知,光在真空中的速度约为300,000km/s,而在其余介质中光 速会大大下降,因此在普通光纤中,工程上通常认为传输速度是200,000km/s。从现实上来讲,能够参考以下:
实时聊天的挑战主要在于如下几点:
实时性: 600ms之内
网络的不对称性
距离
出现花屏、绿屏问题
声画不一样步
画面有时候有点糊
有声音没有画面
画面播放有时候卡顿
网络链接不上
出现马赛克现象?
其余常见指标 和 问题解决方案
【"欢迎关注个人微信公众号:Linux 服务端系统研发,后面会大力经过微信公众号发送优质文章"】