crtmpserver系列(一):流媒体概述

概述

所谓流媒体按照字面意思理解就是像流同样的媒体,看起来像是废话。流媒体如今司空见惯,因此通常人大概不会有疑问。事实上在流媒体尚未出现的时候,基本上经过网络播放电影就不太现实。经过网络播放电影的时候必须先将整个文件下载到电脑上而后才能播放,因此通常都要缓冲好久,这也是为何最开始迅雷等下载工具流行的缘由,其实大多数都是用来下电影了。

流媒体最大的特色便是可以作到边下载边播放,而不须要预先将整个文件所有下载完成以后才能播放,这样极大的改善了用户体验,也提升了实时性,使得网络直播成为可能。

那么流媒体是如何作到边下载边播放的呢,咱们要了解流媒体系统的组成。web

流媒体系统的组成

一个完整的流媒体系统由这些部分组成,信号采集,编码,传输,解码,输出。

信号采集:咱们所说的流媒体系统都是要在计算机系统上面进行处理的,而系统中最主要的元素是音频和视频,从物理上面来讲音频其实是一种经过物理震动造成的机械波,音频采集便是将这种物理波转换为电信号进而转换成二进制的音频数据,通常采集获得的原始音频数据是PCM数据。视频是什么,视频其实是顺序呈现出来的一幅幅连续的静止图像,因此视频其实是由一幅幅静止的图像组成,视频的采集就是接二连三的采集这些静止的图像的过程,这些一幅幅的图像通常被称为帧。那么这些被称为帧的静止图像又是怎么被采集的呢,实际上图像的表现形式并非像声音同样的波,初中的物理咱们就学过成像,咱们之因此可以看到图像,是由于照射在物体上的光反射到咱们的眼睛进入视网膜,传导到视神经最后被咱们大脑感知。因此图像的采集是对光信号的采集与转换,将光信号转换为二进制的图像帧的过程,通常咱们获得的原始图像数据格式是YUV格式。

编码:什么是编码,为何要编码。假设咱们的网络容量是无限的,传输速度也是无限大的,这固然是不须要编码的。而实际上并非,咱们采集到的原始音视频数据量是很大的,因此咱们须要想办法,将采集到的原始的音视频二进制数据量尽可能变小,方便在网络上进行传输,同时又须要在还原(解码)的时候尽可能接近原始音视频(损失,编码也有分为有损和无损)。咱们有时候称编码也叫压缩编码,其实压缩这个概念相似咱们平时的压缩文件的原理同样,举个简单的例子,例若有一个文本文件其内容是00000000000000000000000000000000000000000000000000 这么一串字符串,实际就是50个0字符,咱们彻底能够用最简单的描述来压缩,例如咱们压缩以后文件内容变成50’0’表示这里有50个0字符。在还原的时候这里直接用50个0字符填充便可,这样是否是会节约大量的空间呢,若是不是50个0而是一万个0字符呢,这样通过压缩以后的压缩比会更大,也就是说重复的冗余数据越多,压缩效率越高。固然实际的压缩算法确定没这么简单,说这么个简单的例子只是为了说明原理而已。视频的编码算法有不少种,并且要复杂不少,每一种算法的运行效率,压缩比,损失率都不同。而原理都是同样的,在最多见的概念中,有帧内压缩和帧间压缩。

什么是帧内压缩呢,假设一副图像的背景是纯红色,前面站我的(拍证件照的场景)。在编码的时候一副图像被分红不少小块(宏块),这样因为背景中会有不少相邻的小块都是纯红色,不少纯红色的小块均可以根据其周围的小块推断出来,而不须要单独编码,这就是帧内压缩,这种压缩是在一个帧内部进行的,跟其先后的图像没有关系。

那么帧间压缩又是什么,若是一个视频中相邻的2副图像,背景都是纯红色,背景中有一个球在图像1中的位置是A点。在图像2中的位置是B点。实际上若是把图像1和图像2叠在一块儿会发现他们除了球的位置不同以外,其余的部分是同样的,也就是说这两幅相邻的图像有很大一部分是相同的。在编码第2副图像的时候彻底能够只编码其与上一副图像的不一样部分。若是图像1咱们须要彻底编码,图像1被称为关键帧(通常称为I帧),而图像2在还原的时候须要参考图像1,因此称为参考帧(通常称为P帧)。若是没有关键帧,那么参考帧是没法还原的。固然在编码的时候,一帧不只能够参考其上一帧,还能够参考其下一帧(双向预测的帧间压缩),例如一个球从左滚到右,这种运动是能够作预测的。这种当前帧的编码参考其相邻图像的算法就是帧间压缩算法。

传输:通过采集,编码咱们如今已经得到了音视频数据帧,可是通常观看视频的必定不是在采集编码的现场,不然就不须要传输了,传输的过程就是将编码后的音视频数据经过网络(互联网,或者有线电视网等,咱们只讨论互联网)传输到但愿观看的观众那里。数据从一个地方传递到另外一个地方这个过程就是传输。传输过程当中最重要的固然是流媒体协议了,为何还须要流媒体协议?在流媒体播放的时候会有一些播放逻辑,例如,播放,暂停,跳转,中止,快进,快退。另外在编码以后的数据从一端传递到另外一端,另外一端须要将编码以后的数据还原成编码以前的原始数据才能播放。如何还原?必须得知道以前编码是使用什么算法编码的,在还原的时候才能采用相应的解码算法进行还原。那么编码的时候使用的是什么算法,这个也须要从一端通知到另外一端,这个信息也是在流媒体传输协议中会有的。除此以外还会有其余的一些逻辑信息,例如视频的帧率,关键帧的间隔(GOP Size)等。总结为一句话,编码事后的音视频数据经过网络从一端传递到另外一端,在另外一端对数据还原的时候须要一些信息,而且须要支持一些播放场景的逻辑,这些都须要在流媒体协议中进行描述。目前最流行的流媒体协议,Adobe公司的RTMP,RTSP,微软的MMS等。

解码:通过编码压缩的数据必须还原成编码以前的原始数据才能播放显示,这个还原过程就是解码的过程。

输出:输出的过程就是播放出来的过程,与采集的时候同样,实际上这是将采集的原始音视频数据通过模数转换转换成物理信号,视频信号经过显示器显示出来,音频信号经过音箱放出来。算法

媒体文件封装

咱们以前讨论的是媒体的流式播放,其实这个流式主要是指传输是流动的,并且视频帧能够边传输,边解码播放。若是咱们但愿将播放的内容保存到磁盘上,就必需要有一种文件格式来组织这些数据,以必定的结构来保存这些音视频数据。为何不直接将网络传输过来的内容直接写到一个文件中保存呢,若是直接将全部传输过来的数据不加任何结构组织直接保存的话,那么在播放的时候如何播放?如何知道这些二进制数据哪些是音频哪些是视频,如何知道每一帧音视频数据在文件中的边界,如何知道该音视频的内容是经过什么编码算法编码的,如何知道播放一帧数据以后再隔多长时间播放下一帧数据,若是像有的电影文件须要多种字幕又如何组织。因此这就必需要有一种文件格式可以组织这些音视频数据而且附加这些播放必须的信息在文件中。这就是媒体文件的封装。现存有不少种媒体文件,有的是某个公司的专利,有的是国际标准,例如MP4,MP3,AVI,RMVB等等等等。因此若是要保存这些流媒体数据到文件中,则必须经过必定的文件封装格式将这些音视频数据保存在具备必定格式的媒体文件中。浏览器

传输协议

目前使用的最多的流媒体传输协议固然是RTMP和RTSP了。微软的MMS基本在工做中接触的很少,特别是当前比较火爆的互联网直播。还有一个须要特别提到的HTML5出来以后,不少之前经过flash客户端承载RTMP协议的播放方式被以HLS替换了。可是实时性要求比较高的直播仍是须要经过RTMP或者RTSP协议。HLS严格来讲,其实我感受都不能叫流媒体协议,HLS实际上基本能够认为是一个TS文件的播放列表,没有流媒体协议中的那些逻辑功能,播放,暂停,中止。应该说HLS仅仅是特定状况下出来的,主要是针对跨平台的浏览器进行直播。咱们所看到的HLS大部分都是经过移动设备,PC机器上的浏览器来播放的。服务器

须要指出的是,在与苹果的HLS争夺市场的过程当中,同时出现了多种相似的技术,都是用的HTTP协议,通常咱们称为HTTP渐进式下载。例如微软的Live Smooth Streaming 中文名称为直播平滑流,这种技术须要微软IIS7及以上版本的web服务器和Silverlight客户端支持。另一种是开源的技术好像并非某个公司出品,叫Http Pseudo-Streaming 中文名是伪流。目前只看到一个基于Apache服务器的插件H264 Streaming Module for Apache,客户端貌似也是使用Flash Player。还有一种叫HTTP Dynamic Streaming 中文称作HTTP动态流,是Adobe公司的技术方案,其服务端须要Flash Media Server支持,客户端则是Flash Player。其实如今的Flash Media Server 也已经支持HLS了。苹果的HLS就不说了如今不少服务器以及开源代码都支持HLS,客户端呢只要支持HTML5的浏览器基本也都支持HLS,如今的HLS已是主流。最后要说的是新出现的一种技术标准,MPEG-DASH目的为了统一这些技术方案,还在标准化中,若是真的标准化,也有可能取代HLS,毕竟HLS尚未称为正式标准,只是苹果公司提交了个草案。

RTMP协议的发展得益于flash播放器的普遍传播,而RTSP协议则得益于其协议的开源。本系列要讲解的crtmpserver就是基于RTMP协议的开源流媒体服务器,开发语言为C++。等同的产品还有Red5 语言为Java也是开源。另一个比较有影响力是wowza属于闭源产品。此外RTMPDump项目是用的比较多的RTMP客户端开源项目,其中的librtmp库使用的很普遍,C语言编写。另外OpenRTMFP是基于p2p技术的RTMP。

网络

相关文章
相关标签/搜索