Linux搭建流媒体服务器

| 文章字数:3.2k | 阅读时长:13min
这是一篇更新于 529 天前的文章,其中的信息可能已经有所发展或是发生改变。

流媒体指以流方式在网络中传送音频、视频和多媒体文件的媒体形式。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必等待整个文件下载完毕。由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。作为新一代互联网应用的标志,流媒体技术在近几年得到了飞速的发展。

搭建RTSP流媒体服务器(Darwin Streaming Server)

注意:上来首先关闭linux系统的防火墙以及selinux然后再进行下面的操作。使用命令service iptables stopsetenforce 0来关闭防火墙以及selinux。这里之所以选择关闭是为后面的测试做准备的。⚠仅限学习测试过程中使用,实际生产过程中是🈲不能这样的。

安装依赖组件

1
yum -y install gcc gcc-c++ perl ld-linux.so.2 libstdc++.so.6

下载并安装Darwin Streaming Server

1
2
3
4
wget http://dss.macosforge.org/downloads/DarwinStreamingSrvr5.5.5-Linux.tar.gz
tar -zxvf DarwinStreamingSrvr5.5.5-Linux.tar.gz
cd DarwinStreamingSrvrlinux-Linux
./Install

上述过程均在root用户权限下进行操作。安装的过程中会让你建立一个用户并且设置密码。

访问访问Darwin Streaming Server WEB界面

打开浏览器,在网址栏输入http://192.168.131.129:1220/我这里的服务器IP地址为192.168.131.129,你需要替换成为你自己的服务器IP地址。
初始设置
1.*Setup Assistant MP3 Broadcast Password:这里重复输入你的密码,然后点Next下一步;
*2、
Setup Assistant Secure Administration:不用勾选,直接点Next下一步;
3、Setup Assistant Media Folder:默认为/usr/local/movies,不建议修改,直接点Next下一步;
4、Setup Assistant Streaming on Port 80:不建议改端口,点Finish完成设置向导。

页面如图所示,可以对其进行一系列的操作和修改。
启动服务sudo /usr/local/sbin/DarwinStreamingServer开启WEB服务器sudo /usr/local/sbin/streamingadminserver.pl设置开机启动的话可以编辑/etc/rc.local文件在exit 0之前加入如下内容。

1
2
/usr/local/sbin/DarwinStreamingServer
/usr/local/sbin/streamingadminserver.pl

测试

这里使用的是VLC播放器▶,若没有安装的话可以通过下面命令来安装

1
2
3
cd /etc/yum.repos.d/ 
wget http://pkgrepo.linuxtech.net/el6/release/linuxtech.repo
yum -y install vlc


打开vlc播放器点击上角的“媒体”然后点击打开网络串流然后输入网络地址URL,要想播放/usr/local/movies下的视频。那么输入的地址就是

1
rtsp://192.168.131.128/sample_h264_1mbit.mp4

这里呢显示了绿屏,视频倒是可以播放。但是却看不到动画那么怎么解决呢❓

操作流程为:工具->首选项->视频->显示->输出->OpenGL GLX视频输出。如下所示:

如果想要播放其他的文件夹下的视频的话,在网页端修改Media Directory

下面我们来测试一下,换了文件夹视频能否正常播放呢❓经过测试依旧以可播放。

测试呢是直接把movies目录下的视频移动到media文件夹下,成功测试成功。但是使用media目录下原有的1.MP4媒体文件却报了如下错误。

结果呢出了上图所示的信息,换了目录后播放失败了😂。按道理是可以播放的呀但是为什么会这样呢❓

我的第一反应就是莫非是因为权限的缘故导致无法播放,第二反应则是文件必须得串流才能播放。

想法一

所以首先就分别查看两个文件夹下文件的权限这里发现1.MP4文件的属主和属组均为root,而其他的文件的属主和属组分别是qtss和root。所以我就选择修改1.MP4的权限来试着尝试能否正常播放。结果还是同样的问题😒,所以选择使用修改权限的方法是行不通的。

想法二

既然第一条路走不通那就选择走另外一条路好了🤣实在不行的话,用谷歌上肯定可以找到答案的。那么怎么串流呢主要步骤如下

点击下一个选择RSTP然后点击添加端口选择默认的8554,改成自己的也可。路径改为1.mp4.同时不选择本地显示以及激活转码。然后点击下一个这个页面不需要做操作,直接选择串流就🆗。

到此就貌似好像大概或许应该可能就大功告成了,屁话少说测试一下就知道了。

测试机为装有vlc播放器的windows 7,视频较短的话可以设置循环播放。因为很可能会有这种情况的发生,等你输完URL地址它就播放结束了,还是会提示之前的那种❌错误情况。测试和之前方法一样在这我输入的地址为rstp://192.168.131.129:8554/1.mp4

(⓿_⓿)到此终于大功告成

nginx+ffmpeg搭建流媒体服务器

前面介绍了如何使用Darwin Streaming Server搭建流媒体服务器,下面来介绍使用nginx+ffmpeg搭建流媒体服务器。

安装yasm

Yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集。 接受NASM和GNU汇编器(gas)语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。

下载yasm

1
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

解压和安装

1
2
3
4
5
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install

安装lame

用于mp3编码。由于专利版权问题,ffmpeg默认不带mp3格式编码器,但是有mp3格式解码器。

下载lame

1
2
wget https://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz/download
#下载下来的文件名是down重命名为实际的名字

解压和安装

1
2
3
4
5
6
7
8
mv download lame-3.99.5.tar.gz
tar -zxvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure
make
make install
#编译安装后并没有加入系统库中,添加如下软连接加入系统库
ln -s /usr/local/lib/libmp3lame.so.0.0.0 /usr/lib64/libmp3lame.so.0

安装ffmpeg

下载ffmpeg

1
wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz

解压和安装

1
2
3
4
5
tar -zxvf ffmpeg-3.1.tar.gz
cd ffmpeg-3.1
./configure
make
make install

安装完成后可以通过ffmpeg -version查看安装的版本,可以通过ffmpeg -codecs |grep 媒体格式来查看对媒体格式的支持情况。

安装nginx

安装依赖

1
yum -y install gcc pcre-devel openssl openssl-devel

下载nginx

1
wget  http://nginx.org/download/nginx-1.8.1.tar.gz

解压和安装

1
2
3
4
tar zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure
make && make install

启动nginx

1
/usr/local/nginx/sbin/nginx

可以在浏览器中输入http://localhost来进行测试,看到welcome to nginx则说明安装成功。默认端口为80端口可以通过vim /usr/local/nginx/conf/nginx.conf命令来对nginx的配置文件进行修改。修改完成后重启即可生效

安装rtmp模块

官方github地址:https://github.com/arut/nginx-rtmp-module,因此需要安装git。

1
2
yum -y install git
git clone https://github.com/arut/nginx-rtmp-module.git

重新安装nginx并拓展nginx-rtmp-module模块

1
2
./configure --prefix=/usr/local/nginx  --add-module=../nginx-rtmp-module  --with-http_ssl_module
make && make install

启动 nginx 的命令:

1
2
$ sudo /usr/local/nginx/sbin/nginx -s stop
$ sudo /usr/local/nginx/sbin/nginx

配置推流地址以及播放页面

使用vi /usr/local/nginx/conf/nginx.conf命令来编辑nginx配置文件,主要修改的地方如下

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
##切换自动推送(多 worker 直播流)模式。默认为 off
rtmp_auto_push on;
##当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒
rtmp_auto_push_reconnect 1s;
rtmp {
server{
listen 1935;
#直播流配置
application live {
live on;
record off;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 1s;
}
# 视频点播
application vod {
play /tmp/viedo;
}
application vod_http{
play http://youserverIp/vod;
}
#rtmp日志设置
access_log logs/rtmp_access.log ;
}
http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name 6-07.club;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root /wang/html;
index index.html index.htm;
}
#rtmp状态页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /opt/software/nginx-rtmp-module/;
}

location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}
include vhosts/*.conf;
}

下面来解释一下里面各行代码的含义。对于视频直播服务,如果需要支持多路流输入的话,很简单,在 nginx 配置文件里多配几个 Application 就只可以了,像下面这样:

1
2
3
4
5
6
7
8
application live {
4live on;
4record off;
}
application live2 {
4live on;
4record off;
}

这样就可以通过下面的地址来推送直播流,其它观众端也可以通过下面的地址来访问直播流:

1
2
rtmp://youserverIp/live/test
rtmp://youserverIp/live2/test

后面紧跟的 test 关键字,可以随便更换,只要你的推送流和访问流的地址一样就可以了。

rtmp 模块也可以直接支持 VOD 这种视频点播服务 ,只需要在配置文件里添加如下内容即可:

1
2
3
4
5
6
7
8
# video on demand
application vod {
play /tmp/viedo;
}

application vod_http {
play http://youserverIp/vod;
}

然后把一个 mp4 或是 flv 文件移动到 /tmp/viedo目录下,对于 /tmp/viedo/hello/test.mp4 这个视频文件,就可以通过下面的网址来访问了:

1
rmtp://youserverip/vod//hello/test.mp4

hls直播流配置

如果需要使用 HLS 来视频直播,可以直接像配置文件那样,写上下面这一段:

1
2
3
4
5
application hls {
live on;
hls on;
hls_path /tmp/hls;
}

然后在下面的http中加入如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#rtmp状态页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /opt/software/nginx-rtmp-module/;
}

location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}

配置好后若推流地址为rtmp://193.112.247.63/hls/hello则播放地址如下

  1. 使用rtmp

    1
    rtmp://193.112.247.63/hls/hello
  2. 使用hls

    1
    http://193.112.247.63/hls/hello.m3u8

    此链接是在ios以及mac系统的浏览器内可以直接正常播放直播流的。

使用ffmpeg推流直播

  1. 使用ffmpeg推流到nginx
    使用rtmp协议推一个本地的mp4到上面配置的myapp上

    1
    ffmpeg -re -i /tmp/live/test.mp4 -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/test1"

    流播放地址为:rtmp://193.112.247.63:1935/live/test1或者rtmp://6-07.club:1935/live/test1

    使用hls协议推一个本地的mp4到hls上(apple公司开发的,可在iPad、safari的中进行播放)

    1
    ffmpeg -re -i /tmp/live/test.mp4 -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/hls/test2"

    流播放地址为:http://193.112.247.63/hls/test2.m3u8或者http://6-07.club/hls/test2.m3u8

    上面也讲过hls协议推流同样可以使用rmtp协议来进行拉流。地址为rtmp://193.112.247.63/hls/test2或者rtmp://6-07.club/hls/test2

    使用OBS推流

    🚀这个是传送链接,主要有windows、Linux、macos三种版本,请根据自己的需求下载。

    打开后点击左上角的文件–>设置–>串流。服务选择自定义,服务器选择输入自己的流媒体服务器地址。串流密钥可以随遍填。但是自己要记住,要不然等下播放时会出错。

    播放地址为rtmp://193.112.247.63/hls/obs

    这里采用的是推送本地的媒体源,当然你自己也可以选择其他的。

    使用obs比ffmpeg有诸多的好处,懂得自然都懂这里就不在详细的介绍OBS的强大之处了。

    视频点播服务

    具体怎么实现上面已经介绍过,视频点播服务可以使观众根据自己的爱好来观看视频。点播地址rtmp://193.112.247.63/vod//hello/test.mp4

    这里可以选择快进进行视频的观看,并且可以显示视频的长短。

    未完待续

    网页点播,网页直播。

扫码加我微信