音视频编程: 构建 nginx 推流服务器

本篇分享的主要内容

如何在 macos 中构建本地的推流服务器(nginx + rtmp-nginx-module), 并使用 ffmpeg 命令进行视频推流, 然后使用 VLC 播放器播放视频.

该系列博文:

安装 rtmp-nginx-module

之前在测试 php 程序的时候, 我已经安装过 nginx, 但是发现这样在配置 rtmp-nginx-module 的时候, 无法成功.

配置文件修改完成之后, nginx 总是无法识别 rtmp, 报错如下:

1
[emerg] 30766#0: unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:40

现在需要卸载原来已经安装的 nginx, 命令如下:

1
brew uninstall nginx

再次安装:

1
brew install nginx-full --with-rtmp-module

耐心等待一会 ~~

nginx 的版本(nginx -v):

1
nginx/1.12.2

rtmp-nginx-module 版本:

1
1.1.7.11-dev_2

配置 rtmp

编辑 nginx 的配置文件, 文件位置位于:

1
/usr/local/etc/nginx/nginx.conf

http {} 后面写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rtmp {
server {
#rtmp协议的默认端口号是 1935
listen 1935;
#直播流配置, 访问 path 是 rtmplive
application rtmplive {
#开启实时
live on;
#设置 rtmp 引擎的最大连接数. 默认为off
max_connections 1024;
#不记录数据
record off;
}
}
}

注意: rtmplive 是固定的.

具体的 nginx 配置详见后面的附录内容.

推流

1.安装 ffmpeg 即可.

1
brew install ffmpeg

这个过程有点久, 如果你没有梯子基本安装不了 [大哭]~

2.安装 VLC

直接去官网下载 dmg 包, 安装即可.

打开 VLC 然后选择从 File/Open Network 打开文件, 如下图所示:

1

在弹出的框中, 写入推流地址 rtmp://localhost:1935/rtmplive/channel, 如图所示:

1

直接点击 Open.

注意: 如果 localhost 无法播放, 请更换为你的本机 ip, 如我的本机 ip 是 192.168.1.122, 对应的播放地址为 rtmp://192.168.1.122:1935/rtmplive/channel.
如果还是无法成功, 请关闭 macos 的防火墙.

3.启动 nginx

1
sudo nginx

可以在浏览器访问如下地址, 看看 nginx 是否启动成功.

1
http://localhost:8080/index.html

4.ffmpeg 推流

推流的命令如下:

1
ffmpeg -re -i ~/Desktop/launcher.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/channel

其中 launcher.mp4 是我自己从网络上面下载的一个视频文件, 时长大约是 5 分钟.

在 VLC 中, 就可以看到推流播放的视频了. [开心]~~

附录

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
worker_processes 1;
error_log /usr/local/etc/nginx/logs/error.log debug;
pid /usr/local/var/run/nginx.pid;
events {
worker_connections 256;
}
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 /usr/local/etc/nginx/logs/access.log main;
sendfile on;
keepalive_timeout 65;
index index.html index.php;
include /usr/local/etc/nginx/sites-enabled/*;
include /usr/local/etc/nginx/conf.d/*;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /Users/me/workspace/projs/phpwork/; #web的根目录
index index.php index.html index.htm;
}
}
}
rtmp {
server {
#rtmp协议的默认端口号是1935
listen 1935;
#直播流配置,访问路径是rtmplive
application rtmplive {
#开启实时
live on;
#为rtmp引擎设置最大连接数.默认为off
max_connections 1024;
#不记录数据
record off;
}
}
}

视频文件

使用下载的 mp4 文件, 有些无法播放, 暂时估计应该是码率的问题, 大家在测试过程中, 发现视频无法播放, 最后试试其他视频文件.

另外, 视频文件不要太小, 尽量能让其播放时长在 3-5 分钟.

brew install/uninstall 报错

报错信息如下:

1
2
3
4
5
6
Error: undefined method `patch' for #<Resource:0x000001040877a8>
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/gcc@4.9.rb:55:in `block in <class:GccAT49>'
/usr/local/Homebrew/Library/Homebrew/resource.rb:49:in `instance_eval'
/usr/local/Homebrew/Library/Homebrew/resource.rb:49:in `initialize'
/usr/local/Homebrew/Library/Homebrew/software_spec.rb:111:in `new'
/usr/local/Homebrew/Library/Homebrew/software_spec.rb:111:in `resource'

最终的解决方案是重新安装 Homebrew, 命令如下:

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

检查本机的 ip

1
ifconfig | grep "inet " | grep -v 127.0.0.1
坚持原创技术分享!