浅谈流媒体
什么是流媒体
- 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。 流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。
- 流媒体从本质上讲也是多媒体的一种,其特性是“流式”:无需完整文件,边传边播。媒体提供商在网络上传输媒体的“同时”,用户一边不断地接收并观看或收听被传输的媒体。“流”媒体的“流”指的是这种媒体的传输方式(流的方式),而并不是指媒体本身。
流媒体协议
-
流媒体协议分类
- 点播
英文称为“Video on Demand”,所以也称为“VOD”。是根据观众的要求播放节目的视频点播系统,把用户所点击或选择的视频内容,传输给所请求的用户
点播的特点是静态:播放的对象已经在服务器上按照文件形式准备就绪,客户端只需要按照文件协议进行边下载边播放,也可以缓存后播放
例如:HTTP/MP4/FLV HLS - 直播
直播称为“Live Video”。是按照信号源的实际情况,将实时内容推送到客户端进行呈现,不受客户端控制的一种播放形式,
直播的特点是动态:播放的对象是实时来自于信号源,客户端和服务器都不知道下一秒钟即将播放的内容,而且无法进行暂停等控制。
例如:RTSP RTMP - 伪直播
将直播流进行文件化,降低直播对服务器的压力,提升性能
例如:HLS HDS DASH
-
协议构成
- 编解码格式
视频:H264(avc)、H265(hevc)、VP8、……
音频:AAC、MP3、… - 封装格式:
点播:MP4、FLV、HLS、HDS、DASH、……
直播:FLV、HLS、WEBM、……
传输协议:HTTP、RTMP、RTSP、……
-
常见协议详解
- MP4
MP4简介
MP4是国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组” (Moving Picture Experts Group,即MPEG)制定,用于封装音视频文件,因为
其是标准化组织制定,而并非企业标准,所以应用十分广泛,可谓无处不见。
MP4特点
封装能力强。由于mp4格式特点,mp4可以对多种视频、音频文件进行封装,也可以加入更多的信息;
也是由于其格式特点,可以方便的添加多路视频、音频;
由标准化组织制定,技术支持有保障,应用广泛;
但是相对于流媒体,MP4文件明显臃肿,操作MP4文件难度远大于FLV,在索引信息不完备的情况下无法正常播放,但是作为完整的点播文件还是有着明显优势。
MP4协议分析
MP4文件有众多BOX组成,每个BOX可以理解为树的一个节点。
2.FLV
FLV简介
FLV是一种真正意义的流媒体格式,这是他在流媒体领域不同于MP4最大区别。
FLV也是Flash的御用流媒体格式,所以在web端有着极其广泛的应用。FLV以其封装简单,
特别容易被切片、拆分。而且内部格式采用标准的AMF协议格式标注,通用性强,所以在流媒体
中特别受到开发者喜爱。
FLV特点
文件结构简单明了,对于开发者而言只需要简单的了解FLV协议和AMF协议就可以方便的操作。
没有过多的冗余信息,所以加载速度很快。
开源社区对该格式的支持很丰富,有很多技术支持。
对于流媒体,FLV无须整的索引即可发送并播放,这个是他在流媒体中的最大亮点。而MP4在索引不完整的情况下,使用HTTP进行分段下载是不可能的。
FLV格式分析
首先FLV由文件头和若干个TAG组成,FLV可以封装几乎所有的音视频格式,
常见的FLV中大多用来封装H264的视频流,和MP3音频流。
3.RTMP
RTMP是Real Time Messaging Protocol(实时消息传输协议)的缩写。该协议基于TCP,是一个协议簇,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。
RTMP是最为灵活的一种流媒体协议,支持:
Publish:将客户端的直播流推送到流媒体服务器;
Record:接收来自客户端推送的直播流,在本地存储或者转发输出;
Live:服务器将直播流发送给客户端;
Play:客户端接收来自服务器的直播流并且渲染输出;
两种工作模式:
Pull模式:客户端将直播流推至服务器;
Push模式:服务器主动向上级拉取直播流;
4.HLS
HLS全称是HTTP Live Streaming,是由Apple提出的基于HTTP的流媒体网络传输协议。
它的工作原理是把整个流分成一个个小的基于HTTP文件来下载的,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同个数据速率。
HLS支持H264/AAC和H264/MP3编解码标准,支持普通的Web服务器。
编码器:
对采集的原始数据(包含音视频等数据)进行编码,Apple采用的是H264/AAC标准,编码后的数据封装为MPEG2-TS格式
分割器:
将TS流读入并将其分成一系列的等时间长度(一般为10s)的小的媒体文件。分割器也可以按照需求进行加密(DRM)。
索引文件:
对所有的小的分片文件进行列表保存,对于直播流还需要进行索引刷新,这就是所谓的M3U8文件。
5.RTSP
Real Time Streaming Protocol的缩写,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
协议特点:
编码格式支持H264 H263 AAC MP3等多种格式
强实时性流媒体协议,一般用于视频直播与视频会议
包含RTSP RTP RTCP,协议架构比较复杂,现在一般多用于视频监控(Onvif行业标准)
SDP:
Stream Descript Protocol
RTSP的描述文件
流媒体分发
-
流媒体服务器特性
高并发能力、高IO吞吐量;
非线性、海量的存储能力,查找便捷迅速,可由多个输出通道共享;
流式传输,边传边播;
将音视频切换矩阵和录像机等传统设备的多通道、录制、播放等功能集于一体;
2. 流媒体系统组成
编码工具 :用于创建、捕捉和编辑多媒体数据 ,形成流媒体格式,可以由带视音频硬件接口的计算机和运行其上的制作软件共同完成;
硬件编码器:鼎点 虹软 卓远……
流媒体数据;
服务器 :存放和控制流媒体的数据;
网络 :适合多媒体传输协议或实时传输协议的网络;
播放器 :供客户端浏览流媒体文件。
3. 流媒体系统面临的问题
网络抖动
网络波动造成数据抖动;
一般通过在客户端加入缓存的方式,来消除数据率抖动造成可能带来的画面抖动;
容错处理
RTMP、HTTP协议本身基于TCP协议,已经实现了网络传输容错处理;
RTSP可基于UDP协议,通过客户端的链接尝试以及网络打洞,处理链接容错问题;而通过丢包以及动态码率来处理数据发送错误。即便如此,在公网上也很少使用RTP Over UDP,一般多采用RTP Over RTSP的方式;
延迟
对于直播协议,网络延迟是一个相对明显的问题;
需要根据实际的场景选择不同的直播协议
4. 流媒体服务器功能
点播功能
多格式点播文件分发 | 客户端Seek:字典拖动、时间拖动 | 点播格式转换
直播功能
多协议直播协议分析 | 直播协议转换 | 直播时移
其他功能
防盗链支持 | DRM集成
5. 流媒体服务器开源方案 参考 :阿里云直播服务
live555:开源流媒体服务项目 http://www.live555.com/
NGINX-RTMP: nginx模块 支持rtmp和HLS https://github.com/arut/nginx-rtmp-module
SRS:开源流媒体服务器系统 https://github.com/winlinvip/srs (目前就职阿里的杨成立大神的作品,只能膜拜)
后续会详细写各方案的详细实践细节
6. 流媒体负载均衡
开源负载均衡软件LVS 参考 :阿里云 SLB
性能好。LVS集成在操作系统之内,在网络协议栈的第四层对用户请求进行分发,自身没有流量的产生,因此具有极高的性能;
已被LINUX及FreeBSD等支持,配置简单,操作便捷;
工作稳定。具有完整的双热备方案。
开源负载均衡软件NGINX 参考:阿里云 Tengine
调度灵活。工作在网络协议栈第七层,能对HTTP请求进行解析和分流,支持复杂的正则规则,有更优化的负载调度效果;
网络依赖性低。只要网络可达就可部署,可有效区分内网和外网流量;
支持服务器检测。NGINX能根据上游服务器返回的状态码判断服务器工作状态,并及时将返回错误的请求重新提交到其他节点。
7. CDN对流媒体分发 参考:阿里云点播就是CDN+OSS ,用CDN对OSS中的媒体资源进行加速分发
用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址.
LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期)
ROOT DNS将域名授权dns记录回应给 LocalDns
LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址
域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns
LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址
智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns
LocalDns 将得到的域名ip地址,回应给 用户端
用户得到域名ip地址后,访问站点服务器
CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)
流媒体播放
-
IOS流媒体播放 参考:阿里云ios播放器SDK
iOS对于流媒体播放支持非常完善。iOS使用HLS作为标准流媒体协议支持。并且iOS SDK内置AVFoundation完成视音频的播放与处理
典型的iOS播放器架构基于AVPlayer+AVPlayerItem,在这套架构上,用户可基于API自行定制视频播放器的UI效果,并提供播放进度,缓冲进度,播放状态等多种视频数据的 监听,多通道监听视频流信息。
自定义视频AVPlayerLayer,可对该层添加多种缩放样式
自定义播放控制Bar,可添加多种控制事件触发view
视频流数据管理对象 AVPlayerItem
2. Android流媒体播放 参考:阿里云Android播放器SDK
Android 系统自带轻量级播放器Mediaplayer,它提供了几乎所有普通播放器的操作功能的接口。作为开发者不需要考虑底层如何去网络取视频来进行播放,我们只需要根据API集成播放器,写播放控制等功能。Mediaplayer完整支持H.264、AAC等常见编码格式的解码
MediaPlayer支持RTSP和HLS两种直播流协议,以及HTTP/MP4、HLS等点播协议,我们可以基于MediaPlayer自定义播放器界面,实现多种多样的流媒体播放终端。
3. Flash流媒体播放播放 参考:阿里云Web播放器SDK
Flash是由macromedia公司推出的交互式矢量图和 Web 动画的标准,于2005年12月3日被Adobe公司收购;
Flash一出现,就因为其强大的富媒体特性为BS发展带来了前所未有的进步,特别是其在视音频方面的处理能力,目前仍然超出HTML5很远;
Flash定位于富文本展示工具,对流媒体直播和点播具有天然良好的支持,Flash支持的直播协议为FLV、点播协议为FLV和MP4,通过扩展能够实现HLS的直播和点播;
目前在PC端视音频播放领域,Flash仍然占有至少80%的市场份额,而且基于WeVideo的流媒体编辑是市面上最为出色的在线编辑工具。
4. HTML5流媒体播放 参考:阿里云Web播放器SDK
HTML5是万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改;
HTML5相比前代语言的一项重大变革就是增加了视音频和绘图方面的能力,<video>和<audio>标签的出现,使Flash受到空前的挑战;
HTML5与移动OS更具有亲缘性,目前Android和iOS自带浏览的<video>标签都可以支持HLS的直播协议和HLS、MP4的点播协议;而在PC平台上,<video>标签仍然只能支持点播流媒体协议;
5. 开源播放器方案
FFmpeg:全球领先的多媒体框架 http://ffmpeg.org/
VLC:开源的跨平台多媒体播放器及框架 http://www.videolan.org/
不管移动端还是pc端,均可以集成ffmpeg自己开发播放器,后续会详细讲解安卓集成ffmepg开发播放器
流媒体制作
1. 流媒体编辑 参考 :阿里云 短视频 | 点播剪辑 | 直播导播台
流媒体编辑,是指在终端上直接基于流媒体文件进行在线剪切、拼接、特技预览、字幕叠加、配音等媒体处理的一种媒体编辑方式。
与传统编辑软件的最大区别在于:
编辑的素材来自于互联网(比如视频网站、网络素材库……)
编辑后的节目直接提交到云端进行后续处理(视音频合成、分发到社交网络……)
基于流媒体的编辑,在整个业界都尚处于探索阶段
基于Flash:WeVideo
基于HTML5 : Popcorn
2. 基于Flash的流媒体编辑
WeVideo是目前最为成熟的互联网在线编辑网站 https://www.wevideo.com/
整个编辑客户端基于Flash
支持增加多条视频、音频轨道 | 支持配音 | 多种过渡特技 | 多种视频特技、音频特技 | 多种字幕模板、所见即所得编辑
流媒体支撑
WeVideo使用http协议mp4文件进行编辑 | 后台使用标准流媒体服务器进行支撑
3. 基于HTML5的流媒体编辑
Popcorn是一个基于HTML5的媒体框架 https://popcorn.webmaker.org
开源:https://github.com/secretrobotron/popcorn-maker/network
纯HTML5 + JS | 支持多轨视频叠加、视频缩放拼接 | 字幕支持淡入淡出 | 非帧精确
流媒体支撑
Popcorn使用http协议流媒体 | 文件格式由浏览器决定
总结
综上所诉,流媒体不论从技术难度还是开发成本来说,对于一家公司来说都是一件比较有难度和挑战的事情。所以 在有直播或者点播的业务场景时,可以考虑阿里云直播或者点播服务,从媒体编辑 | 媒体管理 | 媒体加速分发 | 媒体播放 各技术环节都有完整的解决方案或者服务提供。