Nginx + RTMP 实现直播的完整流程:
一、系统架构概述
推流端 (OBS/FFmpeg/手机APP)
↓
[RTMP协议]
↓
Nginx + RTMP 模块
↓
┌─────┴─────┐
↓ ↓
RTMP播放 HLS播放
(VLC/FFplay) (浏览器)
二、安装与配置
1. 安装依赖
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
# CentOS/RHEL
sudo yum install gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel
2. 下载源码并编译
# 下载nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
# 下载nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
# 编译安装
cd nginx-1.24.0
./configure --add-module=../nginx-rtmp-module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_flv_module \
--with-http_mp4_module
make && sudo make install
三、Nginx RTMP配置
完整配置文件 /usr/local/nginx/conf/nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935; # RTMP默认端口
chunk_size 4096;
application live {
live on; # 启用直播
record off; # 不录制
# 推流鉴权(可选)
# on_publish http://localhost/auth;
# HLS配置
hls on;
hls_path /tmp/hls;
hls_fragment 3s;
hls_playlist_length 60s;
# DASH配置(可选)
# dash on;
# dash_path /tmp/dash;
# 转码(可选)
# exec ffmpeg -i rtmp://localhost/live/$name
# -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k
# -f flv rtmp://localhost/hls/$name_hi
# -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 750k
# -f flv rtmp://localhost/hls/$name_low;
}
# 支持FLV播放
application flv {
live on;
flv on;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
# HLS播放地址
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
# DASH播放地址(可选)
location /dash {
alias /tmp/dash;
add_header Cache-Control no-cache;
}
# 状态监控页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /path/to/nginx-rtmp-module/;
}
# 播放器页面
location / {
root html;
index index.html index.htm;
}
}
}
四、启动与测试
1. 启动Nginx
# 启动
sudo /usr/local/nginx/sbin/nginx
# 重启
sudo /usr/local/nginx/sbin/nginx -s reload
# 停止
sudo /usr/local/nginx/sbin/nginx -s stop
2. 推流测试
使用FFmpeg推流:
# 本地文件推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost/live/stream1
# 摄像头推流
ffmpeg -f avfoundation -i "0" -vcodec libx264 -preset ultrafast \
-acodec libmp3lame -ar 44100 -f flv rtmp://localhost/live/stream1
# 屏幕录制推流
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast \
-acodec aac -f flv rtmp://localhost/live/stream1
使用OBS推流:
服务器: rtmp://你的服务器IP/live
串流密钥: stream1 (自定义)
3. 播放测试
RTMP播放:
# VLC播放
vlc rtmp://localhost/live/stream1
# FFplay播放
ffplay rtmp://localhost/live/stream1
HLS播放:
# VLC播放HLS
vlc http://localhost/hls/stream1.m3u8
# 浏览器播放
http://localhost/hls/stream1.m3u8
FLV播放:
ffplay http://localhost/flv?app=live&stream=stream1
五、网页播放器示例
创建 html/player.html:
<!DOCTYPE html>
<html>
<head>
<title>直播播放器</title>
<link href="https://vjs.zencdn.net/7.20.3/video-js.css" rel="stylesheet">
</head>
<body>
<h2>RTMP直播流</h2>
<video id="rtmp-player" class="video-js vjs-default-skin" controls preload="auto" width="640" height="360">
<source src="rtmp://localhost/live/stream1" type="rtmp/mp4">
</video>
<h2>HLS直播流</h2>
<video id="hls-player" class="video-js vjs-default-skin" controls preload="auto" width="640" height="360">
<source src="http://localhost/hls/stream1.m3u8" type="application/x-mpegURL">
</video>
<script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/videojs-flash@2.2.1/dist/videojs-flash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/videojs-contrib-hls@5.15.0/dist/videojs-contrib-hls.min.js"></script>
<script>
// RTMP播放器(需要Flash)
videojs('rtmp-player', {
techOrder: ['flash', 'html5']
});
// HLS播放器
var player = videojs('hls-player');
</script>
</body>
</html>
六、高级配置
1. 多码率自适应流
application live {
live on;
# 原始流
exec ffmpeg -i rtmp://localhost/live/$name
# 高清
-c:v libx264 -b:v 2000k -c:a aac -b:a 128k
-vf scale=1280:720 -f flv rtmp://localhost/live/$name_720p
# 标清
-c:v libx264 -b:v 1000k -c:a aac -b:a 96k
-vf scale=854:480 -f flv rtmp://localhost/live/$name_480p
# 流畅
-c:v libx264 -b:v 500k -c:a aac -b:a 64k
-vf scale=640:360 -f flv rtmp://localhost/live/$name_360p;
}
2. 安全配置
application live {
live on;
# 推流鉴权
on_publish http://localhost/auth_publish;
on_play http://localhost/auth_play;
# 允许/拒绝IP
allow publish 192.168.1.0/24;
deny publish all;
allow play all;
# 推流密钥验证
# 推流地址: rtmp://server/live/stream?key=secret
}
3. 录制配置
application live {
live on;
# 录制所有流
record all;
record_path /var/rec;
record_unique on;
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
# 或按需录制
record off;
record_notify on;
on_record_done http://localhost/record_done;
}
七、监控与调试
查看状态页面
访问:http://你的服务器IP/stat
日志查看
# 查看错误日志
tail -f /usr/local/nginx/logs/error.log
# 查看访问日志
tail -f /usr/local/nginx/logs/access.log
八、常见问题解决
端口被占用
netstat -tlnp | grep 1935
sudo kill -9 <PID>
防火墙配置
# 开放端口
sudo ufw allow 1935/tcp # RTMP
sudo ufw allow 80/tcp # HTTP/HLS
sudo ufw allow 443/tcp # HTTPS
权限问题
sudo chmod 755 /tmp/hls
sudo chown www-data:www-data /tmp/hls
九、生产环境建议
使用Docker部署
docker run -d -p 1935:1935 -p 80:80 \
-v /path/to/hls:/tmp/hls \
tiangolo/nginx-rtmp
配置HTTPS
- 申请SSL证书
- 配置HTTP重定向到HTTPS
- 更新播放器使用
https://
使用CDN加速
负载均衡
这个完整流程涵盖了从安装配置到生产部署的所有环节。根据实际需求调整配置参数即可。