作者 | 阿文, 责编 | 郭芮
头 图 | CSDN 下载自视觉中国
出品 | CSDN(ID:CSDNnews)
随着Web 2.0 的普及以及移动互联网技术的发展,各种视频分享、流媒体直播类型的服务应运而生,例如在线教育、我们会发现今年由于疫情的影响各大学校延迟开学,学生们不得不在家远程上课。各大企业因为疫情影响在家远程开会,各种互联网摄像头可以让你随时随地看到家里的动态,那么你知道这种直播技术它背后的原理吗?如果你想了解直播技术的背后原理, 欢迎继续阅读,我将带你揭开直播技术的神秘面纱。
认识直播技术背后的传输协议
直播技术背后是由多种基于 IP 网络的传输协议组成,统称为流媒体网络传输协议,不同的传输协议应用的场景不一样,通过这些传输协议对数据进行封装后传输,尽可能的保证音视频的数据质量和延迟:
RTMP (Real-Time Messaging Protocol,缩写RTMP)协议
,他最早是由Macromedia为通过互联网在Flash播放器与一个服务器之间传输流媒体音频、视频和数据而开发的一个专有协议。后来这家公司被Adobe 收购,随后这个协议也已发布了不完整的规范供公众使用。由于其延迟相对较低被广泛的使用在各种直播平台上。比如游戏直播、美女直播、电视直播、在线教育等。
RSTP 协议
,这种协议一般应用在各种安全监控摄像头上,比如各种家用的互联网摄像头,RTSP(Real Time Streaming Protocol)实时流协议,RTSP协议利用推式服务器(push server)方法,让音视频浏览端,发出一个请求,网络摄像机只是不停地向浏览端推送封装成RTP分组的音视频编码数据,网络摄像机可以用很小的系统开销实现流媒体传输。
HTTP(HyperText Transfer Protocol)超文本传输协议
,网络摄像机通过HTTP协议提供Web访问功能,很方便地将音视频数据经过复杂网络传输,但实时音视频支持很不理想。比如苹果公司开发的HTTP Live Streaming(缩写是HLS)就是基于 HTTP 协议来实现的流媒体网络传输协议。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用CDN来传输媒体流。但是其延迟相较于 RTMP 会比较高。
那通常我们所看到的各种直播平台都是基于 HLS 或 RTMP 进行的,一般情况下移动端会使用 HLS,兼容性比较好,而 PC 端则使用 RTMP 协议。
RTMP 是怎么工作的?
RTMP连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据。
一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块:
客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。
服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
服务器发送设置带宽()协议消息到客户端。
客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。
服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。
客户端发送命令消息中的“播放”(play)命令到服务器。
接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。
服务器发送用户控制消息中的“streambegin”,告知客户端流ID。
播放命令成功的话,服务器发送命令消息中的“响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端“播放”命令执行成功。
在此之后服务器发送客户端要播放的音频和视频数据。
如何搭建一个直播服务?
搭建一个直播服务的方式有很多种,以 nginx 为例,你可以在编译 nginx 的时候加入
nginx-rtmp-module
模块来实现 RTMP\HLS 等实时流,也可以使用类似
SRS
这样的开源软件来实现,下面我将以 nginx 为例来实现一个直播服务器,如果你是使用 nginx,可以参考。
1.首先,我们需要下载 nginx 和 nginx-rtmp-module 模块:
yum -y install gcc pcre-devel openssl-devel wget -c https://nginx.org/download/nginx-1.17.9.tar.gz tar zxvf nginx-1 .17 .9 .tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git cd nginx-1.17.9 ./configure --prefix=/usr/ local/nginx --add-module =../nginx-rtmp-module --with -http_ssl_module make make install
rtmp { server { listen 1935 ; # 使用 udp 1935 端口 chunk_size 4096 ; application live { # app 名称为 vod live on ; } } }
更具体的配置,请参考GitHub 的Example nginx.conf,nginx-rmtp-module 还可以配置转推、录播、点播等等方式,下面我们启动 nginx:
[root@localhost sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
3.接下来,我们需要放行 tcp 1935 端口。
推流 : 将视频流编码后推到rtmp 服务;
拉流 : 从 rtmp 服务器下载流进行编码播放。
rtmp:// rtmp.example.com/[app]/ [name]
这里的 app 名称就是 nginx 中配置的,是固定的值。后面的 name 是可以随便取的,我们可以按照 FFmpeg 或 obs 软件来推流,使用 FFmpeg 推流如下:
ffmpeg -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://IP地址/live/test
如果使用 obs 软件来推流,只需要添加流名称即可,obs 下载地址 https://obsproject.com/。
首先,添加一个场景为媒体源,然后选择一个本地文件,当然 OBS 还可以添加你的本地显示器或窗口等等。
点击确定后,点击设置,切换到推流,选择服务为自定义,填写服务器地址和串流密钥,点击确定,然后点击开始推流即可。
最后我们使用 vlc 播放,打开 VLC,使用 Network 方式输入 url:
☞ 美团十年,支撑全球最大规模外卖配送的一站式机器学习平台是如何炼成的?
☞ 腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020
☞ 智能合约编写之Solidity的高级特性
☞ 返鄂复工人员自述:回武汉上班,要先飞合肥,再由公司包车接回去