声明
转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/nginx-rtmp-module
服务器介绍
本系列博客中所用到的流媒体服务器是nginx-rtmp-module,文章头部有项目地址。 https://github.com/im-pingo/nginx-rtmp-module是在AlexWoo的基础上进一步开发的。
服务器功能
- 接收rtmp实时流
- 支持rtmp、http-flv、http-ts、hls、hls+(内存切片) 直播服务
- 支持实时录制功能
- 支持主动推流、拉流操作
- 支持动态推流、拉流操作
- 支持鉴权功能
- 支持流状态监控
- 支持时间戳修复
我所做的改进
- 已经修复了AlexWoo项目中的一些bug
- 使rtmp、http-flv、hls、http-ts直播支持mp3、h265编码
- 支持http-ts直播协议
- 支持直播时移服务
- 支持hls+(内存切片)服务(目前仅在dev分支,经过进一步测试后会合并到master分支上)
- 支持服务器端自动修复异常的音视频时间戳功能
- 修复流状态监控后台页面
未来计划
我会持续维护https://github.com/im-pingo/nginx-rtmp-module项目,并且希望能够得到更多人的能够发现问题并且及时在github上提出问题,只要本人看到都会给出回复并且及时修复。
近期准备上线的功能
- 接收http-ts推流
- 支持http-ts回源
- 支持http-fmp4直播协议
搭建流程
环境
本篇文章以Centos系统为例。
安装依赖
yum install -y gcc gcc-c++ openssl openssl-devel pcre-devel
安装
git clone https://github.com/im-pingo/nginx-client-module.git
git clone https://github.com/im-pingo/nginx-multiport-module.git
git clone https://github.com/im-pingo/nginx-toolkit-module.git
git clone https://github.com/im-pingo/nginx-rtmp-module.git
git clone https://github.com/nginx/nginx.git
cd nginx
./auto/configure --add-module=../nginx-client-module
--add-module=../nginx-multiport-module
--add-module=../nginx-toolkit-module
--add-module=../nginx-rtmp-module
make && sudo make install
配置文件
配置文件详解
后面会专门写几篇博客来解析其中的配置项和对应的应用场景。
修改配置
cd /usr/local/nginx
vim conf/nginx.conf
配置模板(此配置能够满足单点服务)
user root;
daemon on;
master_process on;
worker_processes 1;
#worker_rlimit 4g;
#working_directory /usr/local/openresty/nginx/logs;
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
worker_rlimit_nofile 102400;
worker_rlimit_core 2G;
working_directory /tmp;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream_zone buckets=1024 streams=4096;
rtmp {
server {
listen 1935;
application live {
send_all off;
zero_start off;
live on;
hls on;
hls_path /tmp/hls;
wait_key on;
wait_video on;
cache_time 2s;
low_latency on;
fix_timestamp 2000ms;
# h265 codecid, default 12
hevc_codecid 12;
}
}
}
http {
server {
listen 80;
location / {
chunked_transfer_encoding on;
root html/;
}
location /flv {
flv_live 1935 app=live;
}
location /ts {
ts_live 1935 app=live;
}
location /rtmp_stat {
rtmp_stat all;
rtmp_stat_stylesheet /stat.xsl;
}
location /xstat {
rtmp_stat all;
}
location /sys_stat {
sys_stat;
}
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
location /dash {
# Serve DASH fragments
root /tmp;
add_header Cache-Control no-cache;
}
}
}
开启流监控页面
cd nginx-rtmp-module
cp stat.xsl /usr/local/nginx/html/stat.xsl
启动nginx
cd /usr/local/nginx
./sbin/nginx
注意事项
由于nginx需要监听80和1935端口,所以一定要确保你的服务器防火墙没有屏蔽这两个端口。
推流
RTMP推流地址: rtmp://your-server-ip/live/stream-name
播放地址:
- rtmp播放地址: rtmp://your-server-ip/live/stream-name
- http-flv播放地址:http://your-server-ip/flv/stream-name
- http-ts播放地址:http://your-server-ip/ts/stream-name
- hls播放地址:http://your-server-ip/hls/stream-name.m3u8
常用的推流工具有OBS和ffmpeg,具体使用方法这里不再赘述,只给出ffmpeg推送文件的命令。
ffmpeg -re -i your-input-file -vcodec libx264 -acodec aac -f flv rtmp://your-server-ip/live/stream-name
将上述命令中的your-input-file替换成你的媒体文件名,将your-server-ip替换成你的服务器ip地址,stream-name是你希望命名的流名(可随意)。 注意:ffmpeg命令中-re参数含义是按照真实时间戳速率读取文件,这个选项在推送文件到直播服务器中是必须的。另外-vcodec和-acodec是转码参数,如果你要推送的文件视频编码格式本身就是h264编码并且音频编码格式是aac或者mp3的话则不需要这两个参数。(重新编码非常消耗计算资源,使用时要注意)
后台监控
在浏览器中打开:http://your-server-ip/rtmp_stat 可以通过后台页面实时查看当前在线的推拉流情况。