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 |
# 安装依赖 yum -y install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel # 下载 cd /usr/local wget http://nginx.org/download/nginx-1.16.1.tar.gz tar -xzvf nginx-1.16.1.tar.gz && cd nginx-1.16.01 ./configure make && sudo make install nginx -v # 验证安装是否成功 /usr/local/nginx/conf/nginx.conf # 默认配置文件地址 nginx -t # 检测配置文件 nginx -?/-h # 查看帮助 # iptables # vi /etc/sysconfig/iptables (yum install iptables-services -y) -A INPUT -p tcp -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT netstat -ntulp|grep 80 # 测试80端口 kill -QUIT 主进程号 # 停止进程 kill -TERM 主进程号 # 快速停止 pkill -9 nginx # 强制停止 # 编译安装新的可执行程序后 kill -USR2 旧版本Nginx主进程号 # 平滑升级 kill -WINCH 旧版本Nginx主进程号 # 逐步停止旧版本的工作进程 # homebrew 安装 brew tap denji/homebrew-nginx brew install nginx-full --with-rtmp-module --with-debug # 配置文件地址/usr/local/etc/nginx/nginx.conf |
Nginx-rmtp-module 基础
RTMP(Real Time Messaging Protocol)实时消息传送协议,Adobe,应用层协议
HTTP Live Streaming(HLS),苹果公司,M3U8
1 2 3 4 5 6 7 8 9 10 |
#EXTM3U #EXT-X-VERSION:6 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:26 #EXTINF:9.901, xx.easy.com/a/segment1.ts #EXTINF:9.901, xx.easy.com/a/segment2.ts #EXTINF:9.501, xx.easy.com/a/segment3.ts |
NRM(Nginx-rmtp-module)下载地址:https://github.com/arut/nginx-rtmp-module/releases或http://arut.github.io/nginx-rtmp-module/
1 2 3 4 5 6 7 8 |
cd ~/ wget -O "NRM.tar.gz" https://github.com/arut/nginx-rtmp-module/tarball/master # 下载 tar -xvzf NRM.tar.gz # 解压 mv arut-nginx-rtmp-module-791b613 NRM # 简化名称 cd nginx-1.16.1 # 编译安装 ./configure --add-module=../NRM --prefix=/usr/local/nginx --with-debug make && make install |
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 |
events {...} rtmp { server { listen 1935; application mylive{ live on; } } } http {...} |
防火墙
1 2 |
# vi /etc/sysconfig/iptables -A INPUT -p tcp --dport 1935 -j ACCEPT |
推流(参见FFmpeg 从入门到精通-FFmpeg编译安装)
1 |
ffmpeg -i sample.flv -r 25 -b 4M -f flv rtmp://192.168.xx.xx:1935/mylive/6 |
拉流可通过VLC播放器进行测试(File > Open Network…),在其中输入推流地址rtmp://192.168.xx.xx:1935/mylive/6即可
Nginx-rmtp-module 进阶
使用 NRM 支持 HLS 协议直播
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mkdir /usr/local/m3u8File # 创建预备目录 # 配置文件 application mylive{ live on; # 开启直播 hls on; # 开启 HLS 直播 hls_path /usr/local/m3u8File; # 配置 HLS m3u8文件存放地址 } http { server { listen 80; location /mylive_hls { types { application/vnd.apple.mpegurl m3u8; # m3u8 type 设置 video/mp2t ts; # ts 分片文件设置 } alias /usr/local/m3u8File; add_header Cache-Control no-cache; # 禁用缓存 } } } |
推流
1 |
ffmpeg -i sample.flv -vcodec libx264 -acodec aac -f flv rtmp://192.168.xx.xx:1935/mylive/7 |
同样可通过 VLC播放器进行拉流播放,推流过程中,还可以看到/usr/local/m3u8File/目录下会生成很多的 ts 文件
推流的基本格式为ffmpeg -i 视频文件 -vcodec 视频编码库 -acodec 音频编码库 -f flv rtmp://xx,application(如上述的 mylive)之后的参数为串流码(Stream Key),如前面所用到的6和7,用于 区分不同的直播流。
Control 控制器
1 2 3 4 5 6 7 8 |
http { ... server { location /control { rtmp_control all; # 包含 record、drop和redirect } } } |
直播流录制配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
... application mylive{ live on; hls on; hls_path /usr/local/m3u8File; hls_fragment 2s; hls_playlist_length 16s; recorder myRecord { record all manual; record_suffix _.flv; record_path /tmp/rec; # mkdir /tmp/rec && chmod 777 -R /tmp/rec/ } } } ... |
推流
1 |
ffmpeg -i sample.flv -c:v libx264 -c:a aac -f flv rtmp://192.168.xx.xx:1935/mylive/77 |
开启录制访问http://192.168.xx.xx/control/record/start?app=mylive&name=77&rec=myRecord,终止录制将其中的 start 修改为 stop 即可
命令 | 功能 |
---|---|
[off|all|audio|video|keyframes|manual]off | 关闭录制音频与视频 |
all | 录制音频与视频 |
audio | 仅录制音频 |
video | 仅录制视频 |
keyframes | 仅记录关键帧 |
manual | 手动开启和关闭录制(默认自动录制) |
示例:
1 2 |
record all manual # 手动控制,记录音/视频 record audio # 自动控制,记录音频 |
- record_path /xx/xx/ 设置录制文件的输出路径(注意权限设置,否则无法保存)
- record_suffix {1}.flv NRM会将{1}自动替换为 Stream Key
- record_unique on 用于将当前时间戳添加到已被记录的文件中,输出格式为{StreamKey}-{longtime},默认关闭
- record_append on 用于将新数据追加到旧文件中,默认关闭,该设置与 suffix 和 unique 存在冲突
- record_max_size 5000KB 最大录制文件的大小,录制文件超过设置大小,会被清空
drop 命令
1 2 3 4 |
http://192.168.xx.xx/control/drop/publisher?app=mylive&name=77 # 踢出推流用户 http://192.168.xx.xx/control/drop/subscriber?app=mylive&name=77 # 踢出全部拉流用户 http://192.168.xx.xx/control/drop/client?app=mylive&name=77&addr=192.168.xx.xx # 根据IP 踢出拉流用户 http://192.168.xx.xx/control/drop/client?app=mylive&clientid-1 # 根据序号踢出拉流用户 |
redirect 命令
1 2 |
http://192.168.xx.xx/control/redirect/publisher?app=mylive&name=77&newname=1 # 重定向推流地址到 newname http://192.168.xx.xx/control/redirect/subscriber?app=mylive&name=77&newname=1 # 重定向全部拉流用户到新流 |
数据统计模块
流数据统计模块 rtmp_stat
1 2 3 4 5 6 7 8 9 |
... location /liveStat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; #记录流媒体状态 } location /stat.xsl { root /tmp/NRM/; # 指定访问目录 } ... |
访问地址http://192.168.xx.xx/liveStat
Exec 相关功能
1 2 3 4 5 6 7 8 |
application xx { ... # 推流到一个低像素320x240的新流 exec_push ffmpeg -i rtmp://192.168.xx.xx/mylive/$name -s 320x240 -c:v copy -c:a copy -f flv rtmp://192.168.xx.xx/myliveLow/$name; # 拉流 exec_pull ffmpeg -i http://example.com/video_$name.ts -c copy -f flv rtmp://localhost/$app/$name; ... } |
所有指令说明请见https://github.com/arut/nginx-rtmp-module/wiki/Directives
Nginx-rtmp-module 应用
FFmpeg 的组件:libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale、libpostproc和 libswresample 及 ffmpeg、ffplay、ffprobe
FFmpeg 支持的协议:HTTP、RTP、RTSP、RealMedia RTSP/RDT、TCP、UDP、Gopher、RTMP、RTMPT、RTMPE、RTMPTE、RTMPS、SDP、MMS over TCP。
示例
1 2 |
ffmpeg -i input.avi -b 4Mbps output.avi # 将视频码率转码为4Mbps ffmpeg -i input.avi -r 24 output.avi # 将视频转码为24帧 |
libx264安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 安装 nasm(https://www.nasm.us/pub/nasm/releasebuilds/) # 下载解压后进入源码目录 ./configure --prefix=/usr/local/nasm # 配置安装目录 make && make install # 编译安装 # 在vi /etc/profile配置 PATH 环境变量让其可进行访问 export PATH=/usr/local/nasm/bin:$PATH # 安装 x264(https://www.videolan.org/developers/x264.html) # 下载解压后进入源码目录 ./configure --prefix=/usr/local/x264 --enable-shared # 配置动态库 make && make install # 编译安装 # 在vi /etc/profile配置环境变量 export PKC_CONFIG_PATH=/usr/local/x264/lib/pkgconfig # 进入 FFmpeg 源码目录 ./configure --prefix=/usr/local/ffmpeg --enable-libx264 --enable-gpl |
若出现不兼容请至 Git 官网中下载最新版本 FFmpeg重新编译安装
1 |
rm -rf /usr/local/ffmpeg # 删除此前编译安装代码 |
若使用过程中出现类似 libx264.so.155: cannot open shared object file: No such file or directory
1 2 3 4 |
cd /etc/ld.so.conf.d/ # vi x264.conf /usr/local/x264/lib ldconfig -v |
FFmpeg与直播的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
application high{ live on; } application middle{ live on; } application normal{ live on; } application low{ live on; } exec_publish bash -c "ffmpeg -i rtmp://192.168.xx.xx:1935/mylive/$name -f flv -r 25 -s 1920x1080 -an rtmp://192.168.xx.xx:1935/high/$name -f flv -r 25 -s 1280x720 -an rtmp://192.168.xx.xx:1935/middle/$name -f flv -r 25 -s 640x480 -an rtmp://192.168.xx.xx:1935/normal/$name -f flv -r 25 -s 320x240 -an rtmp://192.168.xx.xx:1935/low/$name"; |
- ping 和 ping_timeout:可放于 rtmp 和 server 中,用于主动检查心跳
12ping 15s;ping_timeout 5s; - ack_window: 可放于 rtmp 和 server 中,用于设置 rtmp 确认容器中大小,默认为5000000字节。
1ack_window 5000000; - chunk_size:可放于 rtmp 和 server 中,用于设置流中的块大小,默认值为4096字节。
1chunk_size 4096; - max_message: 可放于 rtmp 和 server 中,用于设置输入数据报文最大尺寸,默认为1MB。
1max_message 1M; - buflen:可放于 rtmp 和 server 中,用于设置缓冲区长度。
1buflen 5s; - rtmp_auto_push:用于设置多任务进行时向多个进程分发任务。
1rtmp_auto_push on; - rtmp_auto_push_reconnect: 用于设置在rtmp_auto_push超时被销毁时,进行重连。
1rtmp_auto_push_reconnect 1s; - meta:可放于 rtmp、server和 application 中,用于将元数据发送到客户端,默认为打开。
1meta copy; - interleave:可放于 rtmp、server和 application 中,用于交叉模式,即音视频在同一个 chunk stream 上,默认关闭。
1interleave on; - wait_key:可放于 rtmp、server和 application 中,用于使视频流从一个关键帧开始,默认关闭。
1wait_key on; - wait_video:可放于 rtmp、server和 application 中,用于禁用音频直至第一个视频帧发送,默认关闭。
1wait_video on; - sync:可放于 rtmp、server和 application 中,用于同步音频流和视频流。
1sync 10ms; - allow,deny:可放于 rtmp、server和 application 中,用于设置白名单和黑名单。
1234allow publish 127.0.0.1; # 允许127.0.0.1推流deny publish all; # 阻止所有推流,allow publish 中的配置除外allow play 192.168.0.0/24; # 允许192.168.0.0/24拉流deny play all; # 阻止所有拉流,allow play 的配置除外 - play:可放于 rtmp、server和 application 中,用于播放本地或远程点播文件。
1234567891011application vod {play /var/flvs;}application vod_http {play http://myserver.com/vod;}application vod_mirror {play /var/local_mirror http://myserver.com/vod; # 第一个地址不可播放时,使用第二个地址} - max_connections:可放于 rtmp、server和 application 中,用于设置最大连接数。
1max_connections 1000; - access_log:可放于 rtmp、server和 application 中。
1access_log logs/rtmp_access.log - log_format:自定义日志格式。
1$remote_addr [$time_local] $command "$app""$name""$args" - $bytes_received $bytes_sent "$pageurl""$flashver" ($session_readable_time)- connection:连接数
- remote_addr:客户端地址
- app_application:名称
- name:最后一个串流码名称
- args:最后一个播放的流/推流参数
- flashver:Flash 版本
- swfurl:swf 地址
- tcurl:tc 地址
- pageurl:客户端页面地址
- command:推/拉流中的命令:none, play, publish, play+publish
- bytes_sent:发送到客户端的字节数
- time_local:连接关闭时间
- session_time:连接持续时间
- session_readable_time:格式化时间
- msec:UNIX时间戳
补充:
由于当前 OBS 推流工具只能添加一个源,因此通常在需要于多个平台进行直播时可使用 Nginx 配置的方式,示例配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; push rtmp://<other streaming service rtmp url>/<stream key>; push rtmp://<other streaming service rtmp url>/<stream key>; } } } |