@程序员,为你揭开直播技术的神秘面纱!

2020 年 3 月 15 日 CSDN

作者 | 阿文,责编 | 郭芮

图 | 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连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据。
握手(HandShake)
一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块:
  • 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。

  • 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。

  • 当客户端和服务器分别收到S2和C2后,握手完成。

建立网络连接(NetConnection)
  • 客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。

  • 服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。

  • 服务器发送设置带宽()协议消息到客户端。

  • 客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。

  • 服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。

  • 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。

建立网络流(NetStream)
  • 客户端发送命令消息中的“创建流”(createStream)命令到服务器端。

  • 服务器端接收到“创建流”命令后,发送命令消息中的“结果”(_result),通知客户端流的状态。

播放(Play)
  • 客户端发送命令消息中的“播放”(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
2.配置 nginx:
   
   
     
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 的 URL 格式如下:
   
   
     
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
这段命令:
  • -i 表示加载本地视频文件
  • -vcodec 指定视频编码方式为h264
  • -acodec 指定音频编码方式为 aac
  • -f flv 表示强制转行为 flv 格式推流
如图所示:
如果使用 obs 软件来推流,只需要添加流名称即可,obs 下载地址 https://obsproject.com/。
首先,添加一个场景为媒体源,然后选择一个本地文件,当然 OBS 还可以添加你的本地显示器或窗口等等。
点击确定后,点击设置,切换到推流,选择服务为自定义,填写服务器地址和串流密钥,点击确定,然后点击开始推流即可。
当开始推流变成停止推流即表示推流成功:
最后我们使用 vlc 播放,打开 VLC,使用 Network 方式输入 url:
推荐阅读 

美团十年,支撑全球最大规模外卖配送的一站式机器学习平台是如何炼成的?

尔·盖茨退出微软公司董事会;苹果 WWDC、微软 Build 大会均改为线上举办;Rust 1.42.0 发布| 极客头条

腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020

我最喜欢的云 IDE 推荐!

智能合约编写之Solidity的高级特性

返鄂复工人员自述:回武汉上班,要先飞合肥,再由公司包车接回去

你点的每一个在看,我认真当成了喜欢
登录查看更多
0

相关内容

即时串流协定(Real Time Streaming Protocol,RTSP)
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
【Manning新书】现代Java实战,592页pdf
专知会员服务
99+阅读 · 2020年5月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
118+阅读 · 2020年5月6日
最新!Yann Lecun 纽约大学Spring2020深度学习课程,附PPT下载
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
14+阅读 · 2019年12月25日
分布式核心技术知识图谱,带走不谢
架构师之路
12+阅读 · 2019年9月23日
云游戏行业发展趋势分析报告
行业研究报告
13+阅读 · 2019年3月24日
揭开GANs的神秘面纱
机器学习算法与Python学习
10+阅读 · 2019年2月27日
【免费直播课程】用户画像建模实践,只等你来!
R语言中文社区
5+阅读 · 2018年8月3日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
干货 | 揭开多语言词嵌入模型的神秘面纱
AI科技评论
5+阅读 · 2018年4月3日
京东用户画像揭秘:原来买iPhone X的是这么些人
R语言中文社区
10+阅读 · 2017年9月14日
Arxiv
4+阅读 · 2019年8月7日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
【Manning新书】现代Java实战,592页pdf
专知会员服务
99+阅读 · 2020年5月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
118+阅读 · 2020年5月6日
最新!Yann Lecun 纽约大学Spring2020深度学习课程,附PPT下载
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
14+阅读 · 2019年12月25日
相关资讯
分布式核心技术知识图谱,带走不谢
架构师之路
12+阅读 · 2019年9月23日
云游戏行业发展趋势分析报告
行业研究报告
13+阅读 · 2019年3月24日
揭开GANs的神秘面纱
机器学习算法与Python学习
10+阅读 · 2019年2月27日
【免费直播课程】用户画像建模实践,只等你来!
R语言中文社区
5+阅读 · 2018年8月3日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
干货 | 揭开多语言词嵌入模型的神秘面纱
AI科技评论
5+阅读 · 2018年4月3日
京东用户画像揭秘:原来买iPhone X的是这么些人
R语言中文社区
10+阅读 · 2017年9月14日
Top
微信扫码咨询专知VIP会员