前言
现在直播已经成为移动互联 时代一个新的重要流量入口,从YY、斗鱼到花椒直播,直播已经成为人们分享交流的新方式,应用场景众多,主要分为:
-
金融类直播:金融直播可应用于实时解盘,在线专家讲座,专家在线直播技术分析、指导投资者等使用场景。
-
大型赛事,演唱会类直播:可应用于大型演唱会,音乐会,游戏,体育赛事等类直播场景。
-
互动类直播:娱乐类互动,如YY等。
-
会议类直播:大型会议直播。
RTMP协议详解
RTMP协议Real Time Message Protocol(实时信息传输协议)的首字母缩写,是由Adobe公司开发的一种用于解决多媒体数据传输流多路复用和分包的 络协议。它工作在TCP协议之上,因此是一种提供可靠交付的协议,在传输时不会出现丢包情况,从而保证了用户体验(QoE)。虽然TCP协议为了提供可靠交付付出了一些额外的开销做为代价,占用了一些带宽和处理器资源,但是随着 络带宽的提高和硬件的发展,这些开销会显得越来越微不足道。因此RTMP协议在为了有很好的发展前景。
官方定义:
The Real-Time Messaging Protocol (RTMP) was designed for
high-performance transmission of audio, video, and data between Adobe
Flash Platform technologies, including Adobe Flash Player and Adobe
AIR. RTMP is now available as an open specification to create products
and technology that enable delivery of video, audio, and data in the
open AMF, SWF, FLV, and F4V formats compatible with Adobe Flash
Player.
协议分类
-
RTMP协议工作在TCP之上,是应用层协议, 默认的端口是1935。
-
RTMPE在RTMP的基础上增加了加密功能。
-
RTMPT工作在HTTP之上,默认端口是80或443,可穿透防火墙。
-
RTMPS类似RTMPT,增加了TLS/SSL的安全功能。
-
RTMFP为RTMP协议的UDP版本。
交互流程
RTMP的交互流程可以分为握手过程、控制命令传输与数据传输。
流程图中所提到的各种状态如下:
状态 | 描述 |
---|---|
未初始化 | 客户端在C0中发送协议版本,如服务端支持,则回发送S0和S1,如果不能,则连接结束 |
版本发送 | 客户端等待S1包,服务端等待C1包,当接收到想要的包,客户端发送C2,服务端发送S2,此时阶段变成了ACK的发送 |
ACK发送 | 客户端和服务端分别等待S2和C2 |
握手完成 | 客户端和服务交换消息 |
理论上来讲只要满足以上条件,如何安排6个Message的顺序都是可以的。但在实际实现中为了尽量减少通信的次数,客户端发送C0+C1,服务端发送S0+S1+S2,再客户端在发送C2结束握手。
消息是RTMP协议中基本的数据单元,不能种类的消息包含有不能的消息类型(Message Type)。RTMP协议一共规范了十多种消息类型。其中类型为8,9的消息分别用于传输音频和视频数据。消息头包含以下信息:
-
Message Type: 消息类型,占用1个字节。
-
Length: 有效负载的字节数,占用3个字节。该字段是用大字节序表示的。
-
Timestamp: 时间戳,占用4个字节,用大字节序表示。
-
Message Stream Id: 消息流ID,标识消息所使用的流,用大字节序表示。
消息块格式
在 络上传输数据时,消息需要被拆分成较小的数据块才适合在相应的 络环境上传输。RTMP协议中规范了对消息拆分成消息块,每个消息块首部(ChunkHeader)有三部分组成:用于标识本块的ChunkBasicHeader,用于标识本块负载所属消息的ChunkMessageHeader,以及当时间戳溢出时才出现的ExtendedTimestamp。
消息分块
RTMP传输媒体数据的过程中,发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。接收端在通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据。
开源技术选型
Red5
简介
GitHub:https://github.com/Red5/red5-server (1k+ stars)
- 创建安装目录:
mkdir -p /Users/ypzdw/gitchat/rtmp/red5
- 设置主目录环境变量:
export RED5_HOME=/Users/ypzdw/gitchat/rtmp/red5
- 下载red5应用,并解压到RED5_HOME:
https://github.com/Red5/red5-server/releases/download/v1.0.7-RELEASE/red5-server-1.0.7-RELEASE.tar.gz
选择”Publisher” demo,该项目提供了主播端与听课端。
直播收听端:“1”中Name为收听的流名;“2”中 Location为直播端地址;“3”中Log可以观察到整个直播的交流日志。
- 停止应用:
cd /Users/ypzdw/gitchat/rtmp/red5
./red5-shutdown.sh
Nginx-Rtmp
Github:https://github.com/arut/nginx-rtmp-module (5k+ stars)
- 操作系统
CentOS 7.2 x86_64 Linux
-
配置服务器
超过1024的连接数测试需要打开linux的限制。且必须以root登录和执行
设置连接数:
查看连接数:
-
客户端
-
直播端
目前最好用的直播端软件是OBS(Open Broadcaster Software)。下载地址是:
https://obsproject.com/download
快速设置:
视频的清晰度与码率和品质有关,码率大,品质高,那么视频的清晰度就高,同时,对带宽的要求也越大。详细的参数设定参考如下:
-
直播推流设置,打开“设置”->”流”,URL输入推流地址的URL,流名称输入推流的名称,如下图所示
-
支撑线上峰值近10万人,并无故障运行一年有余。
-
配置中心会定期刷新直播端与收听端APP的路由信息。
-
直播端APP推流到Master集群。
-
由于nginx-rtmp本身不支持集群,因此我们在架构时没有采用从Master集群Forward推流到Slave集群的方式,而是设计了当收听端拉流到slave服务器集群时,如果不存在该流,就会从Master集群主动拉取流的架构,解决了直播集群的大规模并发问题。
-
该架构在大规模并发情况下,比Master推流到Slave流的架构节省了很大的带宽。
-
除此之外我们对nginx-rtmp进行了源代码的修改,支撑了一些如合成,转码,高级录制等功能。
wget http://nginx.org/download/nginx-1.11.5.tar.gz
tar -zxvf nginx-1.11.5.tar.gz
下载nginx-rtmp模块源码:
wget https://github.com/arut/nginx-rtmp-module/archive/v1.1.10.tar.gz
tar -zxvf v1.1.10.tar.gz
编译nginx,如果需要调试消息则打开–with-debug:
./configure –add-module=/root/rtmp/src/nginx-rtmp-module-1.1.10 –with-debug
make
make install
创建录制文件存储目录:
rtmp 模块配置(nginx.conf):

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!