文章

音视频服务器篇

音视频服务器篇

该文记录音视频入门学习。

音视频服务器篇

1. 介绍

市面上优秀的流媒体服务器解决方案有很多,比如 SRSRed5EasyDarwinnginx-rtmplive555mediasoup 等等。

2. nginx-rtmp 的部署

主要介绍下使用 nginx-rtmp 来部署一套流媒体服务器,并用 FFmpeg 来推流,Pot Player 来拉流。

2.1. 环境

  • Ubuntu20.04
  • nginx-1.24.0
  • nginx-rtmp-module-1.2.2

2.2. 下载 nginx 和 nginx-rtmp-module

1
2
3
4
5
6
7
# nginx
https://github.com/nginx/nginx
https://nginx.org/en/download.html

# nginx-rtmp-module
https://github.com/arut/nginx-rtmp-module
https://github.com/arut/nginx-rtmp-module/tags

我是将安装包放置到 /home/august/work/ 目录下(这个可以自定义放置)。

2.3. 解压压缩包

1
2
3
4
5
6
# 进入安装包目录
cd /home/august/work

# 解压
tar xvf nginx-1.24.0.tar.gz
unzip nginx-rtmp-module-1.2.2.zip

2.4. 编译 nginx

1
2
3
4
5
6
7
8
9
# 进入 nginx 目录
cd nginx-1.24.0

# 设置安装目录、依赖模块(最好使用绝对路径,不然后面执行程序时相对路径出现问题)
./configure --prefix=/home/august/work/nginx-1.24.0/build --add-module=/home/august/work/nginx-rtmp-module-1.2.2
# 编译(j 后面数字表示多线程编译)
make -j4
# 安装
make install

2.5. config过程中错误及错误处理

如果 Ubuntu20.04 是新安装的话,极有可能缺啥以下依赖

1
2
3
error: ./configure: error: the HTTP rewrite module requires the PCRE library.
error: ./configure: error: SSL modules require the OpenSSL library.
error: ./configure: error: the HTTP gzip module requires the zlib library.

安装缺少依赖即可

1
2
3
4
5
6
7
8
# 软件更新
sudo apt-get update
sudo apt-get upgrade

# 安装依赖
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
sudo apt-get install zlib1g-dev

2.6. 配置文件

安装成功后可以看到 nginx 服务和相关配置在 /home/august/work/nginx-1.24.0/build 中,我们需要修改 ./build/conf/nginx.conf

1
vim ./build/conf/nginx.conf

在文件末尾加上以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
rtmp {
    server {
        listen 1935;
        chunk_size 4096;

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

        # play videos
        application rtmp_play {
            play /home/august/work/videos;  # 点播视频存放路径(建议还是绝对路径)
        }
    }
}

2.7. 启动 nginx

1
2
3
4
# 绝对路径
sudo /home/august/work/nginx-1.24.0/build/sbin/nginx

# 相对路径(因为编译配置都是绝对路径,所以启动相对路径没影响;如果配置相对路径,出现问题大概率是路径问题)

2.8. ffmpeg推流1

1
2
3
4
5
6
7
8
# -i 推流文件名称
# -vcodec libx264 视频
# -acodec aac     音频
# -f flv rtmp://[ip]:[port]/[type]/[stream_name] 
#	ip,port服务器地址和的上述配置监听端口
# 	type根据上述配置决定,rtmp_live是直播,rtmp_play是点播
#	name推流名称
ffmpeg -i SampleVideo_1280x720_30mb.flv -vcodec libx264 -acodec aac -f flv rtmp://192.168.199.129:1935/rtmp_live/mystream

2.9. Pot Player 拉流(直播、点播)

打开 Pot Player 在主界面依次点击右键 ==》 打开 ==》 打开链接(或者快捷键 Ctrl + U),在打开的界面的打开链接中输入对应推流地址。

1
2
3
4
5
# 直播
rtmp://192.168.199.129:1935/rtmp_live/mystream

# 点播
rtmp://192.168.199.129:1935/rtmp_play/SampleVideo_1280x720_30mb.flv

3. SRS 的部署2

本篇文章,我们详细介绍下使用 SRS 来部署一套流媒体服务器,并用 FFmpeg 来推流,Pot Player 来拉流。

3.1. 环境

  • Ubuntu20.04
  • srs-server-5.0-b3

3.2. 下载 srs

1
2
https://github.com/ossrs/srs
https://github.com/ossrs/srs/releases

我是将安装包放置到 /home/august/work/ 目录下(这个可以自定义放置)。

3.3. 解压压缩包

1
tar xvf srs-server-5.0-b3.tar.gz 

3.4. 编译 srs

1
2
3
4
5
6
7
8
9
# 进入 srs 目录
cd srs-server-5.0-b3/trunk/

# 设置安装目录、依赖模块(最好使用绝对路径,不然后面执行程序时相对路径出现问题)
./configure --prefix=/home/august/work/srs-server-5.0-b3/trunk/build --full
# 编译(j 后面数字表示多线程编译)
make -j4
# 安装
make install

3.5. config过程中错误及错误处理

3.5.1. 问题一

1
2
3
4
5
Please install tclsh by:
  apt install -y tclsh

Please install cmake by:
  apt install -y cmake

缺少依赖 tclshcmake

1
2
sudo apt install -y tclsh
sudo apt install -y cmake

3.5.2. 问题二

1
2
3
Building opus-1.3.1.
./auto/depends.sh: line 494: autoreconf: command not found
Build opus-1.3.1 failed.

缺少依赖 autoconf automake libtool

1
sudo apt-get install autoconf automake libtool

3.6. 配置文件

安装成功后可以看到 srs 服务和相关配置在 /home/august/work/srs-server-5.0-b3/trunk/build 中。

原来的配置文件是 conf/srs.confSRS 可以通过参数选择配置文件启动服务,所以我们可以增加自定义配置文件 ./build/conf/my_hls.conf,因为官方文档也是使用相对路径,所以沿用相对路径

1
2
3
4
5
# 进入 build 目录
cd build

# 编辑(添加)文件
vim conf/my_hls.conf

在新文件里添加以下内容

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
listen              1935;
max_connections     1000;
daemon              on;
srs_log_tank        file;
srs_log_level        error;
srs_log_file        ./objs/srs.log;

http_server {
    enabled         on;
    listen          8081;
    dir             ./objs/nginx/html;
}

vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_fragment    10;
        hls_window      60;
        hls_path        ./objs/nginx/html;
        hls_m3u8_file   [app]/[stream].m3u8;
        hls_ts_file     [app]/[stream]-[seq].ts;
        hls_cleanup     on;
        hls_dispose     30;
        hls_on_error    continue;
        hls_storage     disk;
        hls_wait_keyframe       on;
        hls_acodec      aac;
        hls_vcodec      h264;
    }
}

3.7. 启动 srs

因为配置文件使用相对路径所以必须在 安装目录层级启动

1
2
# 使用相对路径
sudo ./objs/srs -c ./conf/my_hls.conf

3.8. ffmpeg推流

1
2
3
4
5
6
7
8
# -i 推流文件名称
# -vcodec libx264 视频
# -acodec aac     音频
# -f flv rtmp://[ip]:[port]/[file_name]/[ts_name] 
#	ip,port 	服务器地址和的上述配置监听端口
# 	file_name	./objs/nginx/html/ 文件下会创建目录
#	ts_name 	ts和m3u8文件前缀
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -vcodec libx264 -acodec aac -f flv rtmp://192.168.199.129:1935/live/index

生成的 m3u8ts 文件路径,在推流时滚动式生成,推流结束后清理

1
/home/august/work/srs-server-5.0-b3/trunk/build/objs/nginx/html/live

3.9. Pot Player 拉流(rtmp、http)

1
2
rtmp://192.168.199.129:1935/live/index
http://192.168.199.129:8081/live/index.m3u8

4. live555 的部署

4.1. 环境

  • Ubuntu20.04
  • live.2023.07.24

4.2. 下载 srs

1
2
https://github.com/rgaufman/live555
http://www.live555.com/liveMedia/public/

我是将安装包放置到 /home/august/work/ 目录下(这个可以自定义放置)。

4.3. 解压压缩包

1
tar xvf live.2023.07.24.tar.gz

4.4. 编译 srs

1
2
3
4
5
6
7
# 进入 srs 目录
cd live

# 设置编译环境
./genMakefiles linux-64bit
# 编译(j 后面数字表示多线程编译)
make -j4

4.5. 编译问题3

1
2
3
4
5
6
7
BasicTaskScheduler.cpp: In member function ‘virtual void BasicTaskScheduler::SingleStep(unsigned int)’:
BasicTaskScheduler.cpp:191:40: error: ‘struct std::atomic_flag’ has no member named ‘test’
  191 |       if (fTriggersAwaitingHandling[i].test()) {
      |                                        ^~~~
make[1]: *** [Makefile:41: BasicTaskScheduler.o] Error 1
make[1]: Leaving directory '/home/august/work/live/BasicUsageEnvironment'
make: *** [Makefile:38: all] Error 2

原因是下载的版本太新, struct std::atomic_flag 需要 C++20 才能支持,所以编译不过,需要添加编译 -DNO_STD_LIB 来解决,根据不同编译环境修改不同的配置文件 Ubuntu20.04 修改的是 config.linux-64bit

1
2
3
4
5
6
7
# 修改读写权,原来是只读
sduo chmod 777 config.linux-64bit

# 修改文件
sudo vim config.linux-64bit
# 在第一行最后添加 -DNO_STD_LIB
COMPILE_OPTS =          $(INCLUDES) -m64  -fPIC -I/usr/local/include -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_STD_LIB

4.6. 启动 live555

普通启动有端口号, sudo 启动没有端口号。

1
2
cd mediaServer
./live555MediaServer

4.7. 上传视频

将视频文件上传至 live/mediaServer 目录下

4.8. Pot Player 拉流(rtsp)

拷贝 live555 生成的 url + filename

1
rtsp://192.168.199.129:8554/SampleVideo_1280x720_30mb.mkv

参考

本文由作者按照 CC BY 4.0 进行授权