java程序员直播(为你揭开直播技术的神秘面纱)(1)

作者 | 阿文,责编 | 郭芮

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

随着Web 2.0 的普及以及移动互联网技术的发展,各种视频分享、流媒体直播类型的服务应运而生,例如在线教育、我们会发现今年由于疫情的影响各大学校延迟开学,学生们不得不在家远程上课。各大企业因为疫情影响在家远程开会,各种互联网摄像头可以让你随时随地看到家里的动态,那么你知道这种直播技术它背后的原理吗?如果你想了解直播技术的背后原理, 欢迎继续阅读,我将带你揭开直播技术的神秘面纱。

java程序员直播(为你揭开直播技术的神秘面纱)(2)

认识直播技术背后的传输协议

直播技术背后是由多种基于 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 协议。

java程序员直播(为你揭开直播技术的神秘面纱)(3)

RTMP 是怎么工作的?

播放一个RTMP的流媒体需要经过以下几个步骤:

RTMP连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据。

握手(HandShake)

一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块:

建立网络连接(NetConnection)

建立网络流(NetStream)

播放(Play)

播放流

java程序员直播(为你揭开直播技术的神秘面纱)(4)

如何搭建一个直播服务?

搭建一个直播服务的方式有很多种,以 nginx 为例,你可以在编译 nginx 的时候加入 nginx-rtmp-module 模块来实现 RTMP\HLS 等实时流,也可以使用类似SRS这样的开源软件来实现,下面我将以 nginx 为例来实现一个直播服务器,如果你是使用 nginx,可以参考。

1.首先,我们需要下载 nginx 和 nginx-rtmp-module 模块:

yum -y install gcc pcre-devel openssl-develwget -c https://nginx.org/download/nginx-1.17.9.tar.gztar zxvf nginx-1.17.9.tar.gz

git clone https://github.com/arut/nginx-rtmp-module.gitcd nginx-1.17.9./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_modulemakemake install

2.配置 nginx:

rtmp {server {listen 1935; # 使用 udp 1935 端口chunk_size 4096;application live { # app 名称为 vodlive on;}}}

更具体的配置,请参考GitHub 的Example nginx.conf,nginx-rmtp-module 还可以配置转推、录播、点播等等方式,下面我们启动 nginx:

[root@localhost sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf

3.接下来,我们需要放行 tcp 1935 端口。

java程序员直播(为你揭开直播技术的神秘面纱)(5)

如何获取流?

当流媒体服务器搭建完毕之后,我们需要做两个步骤:

一个 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

这段命令:

如图所示:

java程序员直播(为你揭开直播技术的神秘面纱)(6)

首先,添加一个场景为媒体源,然后选择一个本地文件,当然 OBS 还可以添加你的本地显示器或窗口等等。

java程序员直播(为你揭开直播技术的神秘面纱)(7)

点击确定后,点击设置,切换到推流,选择服务为自定义,填写服务器地址和串流密钥,点击确定,然后点击开始推流即可。

java程序员直播(为你揭开直播技术的神秘面纱)(8)

当开始推流变成停止推流即表示推流成功:

java程序员直播(为你揭开直播技术的神秘面纱)(9)

最后我们使用 vlc 播放,打开 VLC,使用 Network 方式输入 url:

java程序员直播(为你揭开直播技术的神秘面纱)(10)

java程序员直播(为你揭开直播技术的神秘面纱)(11)

java程序员直播(为你揭开直播技术的神秘面纱)(12)

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

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

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

☞我最喜欢的云 IDE 推荐!

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

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

,