编程技术分享平台

网站首页 > 技术教程 正文

利用nginx搭建服务器《RTMP视频点播、直播、HLS》

xnh888 2024-09-22 16:55:04 技术教程 24 ℃ 0 评论

一、环境和工具

ubuntu 14.04 desktop

不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦。

不建议使用 最新的16TLS,我一开始就用它来做的,但是各种坑,因为很多包都被废弃或者必须降级

Nginx1.8.1

这个是我之前装的版本,版本没什么大的影响

我是源代码编译安装的,不建议用 apt-get install nginx

nginx-rtmp-module

github地址:https://github.com/arut/nginx-rtmp-module

直播肯定用大名鼎鼎的OBS

OBS地址: https://obsproject.com/

观看目前只是用客户端观看,使用的是VLC media player

二、安装Ngnix

1、安装各种依赖包

$ apt-get install openssl libssl-dev libpcre3 libpcre3-dev

yum install -y pcre-devel zlib-devel openssl openssl-devel

2、编辑安装nginx与rtmp-module

nginx和nginx-rtmp-module是一起编译安装的。

编译安装Nginx

http://nginx.org/download/nginx-1.14.0.tar.gz

#注意nginx-rtmp-module-master的路径

$ ./configure --add-module=../nginx-rtmp-module-master --prefix=/opt/nginx --with-http_ssl_module

$ make

$ make install

sbin/nginx --options


点播视频服务器的配置

通过上一步nginx服务器已经搭建完成,然后我们就可以开启一个视频点播的服务了。打开配置文件nginx.conf,添加RTMP的配置。

worker_processes 1;

events {

worker_connections 1024;

}

rtmp { #RTMP服务

server {

listen 1935; #//服务端口

chunk_size 4096; #//数据传输块的大小

application vod {

play /opt/vide/vod; #//视频文件存放位置。

}

}

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {

listen 80;

server_name localhost;

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

配置目录*/opt/video/vod*为存放视频文件的位置了,那我们就往里面放一个文件吧。我放了一个qq.mp4文件。

文件放好之后,那就让我们重新启动一下nginx

sudo ./sbin/nginx -s reload

打开视频播放软件选用的是VLC media-> open network stream…

如图填写我们要点播的节目地址rtmp://localhost/vod/qq.mp4 如图:

点击play就可以播放了。

当然点播不使用RTMP插件nginx自身也是可以实现点播服务的。那就是配置location部分,由于下面我们要配置直播和回看功能所以选用了RTMP服务。

直播视频服务器的配置

接着我们就在点播服务器配置文件的基础之上添加直播服务器的配置。一共2个位置,第一处就是给RTMP服务添加一个application这个名字可以任意起,也可以起多个名字,由于是直播我就叫做它live吧,如果打算弄多个频道的直播就可以live_cctv1、live_cctv2名字任意。第二处就是添加两个location字段,字段的内容请直接看文件吧。

worker_processes 1;

events {

worker_connections 1024;

}

rtmp {

server {

listen 1935;

chunk_size 4096;

application vod {

play /opt/video/vod;

}

application live{ #第一处添加的直播字段

live on;

}

}

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {

listen 80;

server_name localhost;

location /stat { #第二处添加的location字段。

rtmp_stat all;

rtmp_stat_stylesheet stat.xsl;

}

location /stat.xsl { #第二处添加的location字段。

root /usr/local/nginx/nginx-rtmp-module/;

}

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

添加完这两处之后,重新启动nginx打开浏览器看看,是否有如下图显示:

有没有看到红框框的live字样呢?如果可以显示出来,证明你的配置生效了。

还等什么让我们推送一个节目看看(其实专业词叫录制,后面将会使用录制这个词。)吧。

这次推送我使用的是OBS(Open Broadcaster Software)有关它的安装请参考先前我写的Ubuntu安装OBS(Open Broadcaster Software)后面的博客里我会给大家介绍如何使用手机采集视频并且推送到服务器上。

配置OBS如图:

点击红圈添加“Media Source”,会弹出一个框框,里面的内容就按照图片显示配置就可以了。点击“OK”就能在你的屏幕上播放了。

配置节目的输出流如图所示: 首先点击红圈“setting”进入设置界面。记得要正确填写要录制的服务器路径。配置好就可以点击OK了。退出后点击蓝圈,就开始录制节目了。

查看我们的了录制的节目,服务器有没有接收到呢?打开我的服务器地址“http://localhost/stat”查看一下 ,你的显示是否和我的相同呢?如果相同证明服务器已经接收到了录制的节目,客户端可以进行播放了。

播放的地址就是“rtmp://localhost/live/test”,如果您本地有支持rtmp协议的播放器就可以试试了。最后奉上一张观看直播的屏幕截图。


实时回看

如果直播服务能够把节目录制在本地,就可以直接回看先前的节目了

rtmp配置部分:

application live { live on; hls on; #这个参数把直播服务器改造成实时回放服务器。 wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。 hls_path /opt/video/hls; #切片视频文件存放位置。 hls_fragment 10s; #每个视频切片的时长。 hls_playlist_length 60s; #总共可以回看的事件,这里设置的是1分钟。 hls_continuous on; #连续模式。 hls_cleanup on; #对多余的切片进行删除。 hls_nested on; #嵌套模式。 }

http部分

location /stat.xsl { root /usr/local/nginx/nginx-rtmp-module/; } location /live { #这里也是需要添加的字段。 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias /opt/video/hls; expires -1; add_header Cache-Control no-cache; }

application myapp {

live on;

}

application hls {

live on;

hls on;

hls_path /tmp/hls;

}

由于这次nginx需要向服务器写切片视频文件,但nginx又没有给nginx指定用户名只能走默认的nobody用户和nogroup用户组,其实就是没有组。所以需要对写入的目录做增大权限的修改。 chmod -R 777 /opt/video/hls

播放视频,“http://localhost/live/test/index.m3u8”。

六、问题

这个只是实现了推流然后能观看,依旧有很多问题。

在windows上直播观看延迟大约在5-10秒,如果非局域网这个速度没法看。

现在所有人只要填写推流地址,就能进行播放和查看,没有权限控制,虽然rtmp本身对ip有一个策略机制可以配置,但是并没有什么实际的用处,需要结合程序实现控制,也是后面需要实现的功能

目前还没有考虑网页上的观看,网页上考虑使用html5流媒体播放器,结合hls协议实现。

总结;

nginx配合ffmpeg做流媒体服务器的原理是:nginx通过rtmp模块提供rtmp服务,ffmpeg推送一个rtmp流到nginx,然后客户端通过访问nginx来收看实时视频流。HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是ffmpeg推送流仍然是rtmp的。

有什么不懂的可以关注+私信‘资料’MF分享相关资料。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表