XStack

Deep into details

0%

RTMP推流到Nginx并播放

直播火了好几年了,当然要了解下原理。

周末使用RTMP做了几个简单实验,记录如下:

获取所有可以录制的视频源#

1
2
3
4
5
6
7
8
9
$ ffmpeg -devices
$ ffmpeg -f avfoundation -list_devices true -i ""

# outputs like:
[AVFoundation input device @ 0x7ff7d0504640] AVFoundation video devices:
[AVFoundation input device @ 0x7ff7d0504640] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7ff7d0504640] [1] Capture screen 0
[AVFoundation input device @ 0x7ff7d0504640] AVFoundation audio devices:
[AVFoundation input device @ 0x7ff7d0504640] [0] Built-in Microphone

推流一个本地文件#

1
$ ffmpeg -re -stream_loop -1 -i out.mp4 -vcodec libx264 -acodec aac -f flv rtmp://xxxx.com:1935/hls/test

录制屏幕#

1
$ ffmpeg -f avfoundation -i "Capture screen 0" -r:v 30

播放视频#

1
$ ffplay https://xxxx.com/hls/test.m3u8

录制屏幕并推流#

1
$ ffmpeg -f avfoundation -i "Capture screen 0" -r:v 30 -vcodec libx264 -acodec aac -f flv rtmp://xxxx.com:1935/hls/test

推流工具#

实际使用中,一般都会采用OBS进行推流。

附:Nginx上安装rtmp服务器#

下载源码、编译与安装#

从下面两个地址找到源码包
最新的Nginx源代码
openssl最新源码地址
然后,解压缩到~/softs/目录下,再下载一份nginx-rtmp-module到~/softs/目录,然后三个包一起编译、安装:

1
2
3
4
5
6
7
8
9
10
$ cd ~/softs/ #没有可以自己创建,或者其它临时目录也可以
$ wget https://nginx.org/download/nginx-1.17.6.tar.gz
$ tar zxvf nginx-1.17.6.tar.gz
$ wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
$ tar zxvf openssl-1.1.1d.tar.gz
$ git clone https://github.com/arut/nginx-rtmp-module
$ cd nginx-1.17.6/
$ ./configure --prefix=/usr/local/nginx --with-http_v2_module --with-http_ssl_module --with-openssl=../openssl-1.1.1d --add-module=../nginx-rtmp-module
$ make
$ make install #按需决定是否需要sudo

安装完毕后,执行命令测试是否安装成功:

1
sudo /usr/local/nginx

然后通过浏览器访问80端口: http://localhost/
如果看到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
# 将下面这个段落配置到http平级的位置
rtmp {
server {
listen 1935;
application live {
live on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
application vod {
play /tmp/video;
}
}
}
# server中添加一个目录,并配置mimetype
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}

配置完成后重启就可以接收推流了