HLS.js使用指南与最佳实践
深入解释HLS.js工作原理、应用场景与优缺点,提供完整代码示例和常见问题解决方案。
阅读更多 →从零开始,搭建属于你自己的直播流媒体服务器
Nginx-RTMP是一个开源的Nginx第三方模块,由俄罗斯开发者Roman Arutyunyan开发。它为Nginx增加了RTMP(Real-Time Messaging Protocol)协议支持,可以将Nginx变成一个功能强大的流媒体服务器。
RTMP协议最初由Macromedia公司(后被Adobe收购)开发,用于Flash播放器和服务器之间的音视频传输。虽然Flash已经退出历史舞台,但RTMP协议因其低延迟、成熟稳定的特点,至今仍是直播推流的事实标准。
在Ubuntu上安装Nginx-RTMP需要从源码编译,因为RTMP模块不是Nginx的官方模块。下面是详细的编译安装步骤。
首先安装编译所需的依赖包:
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev -y
下载Nginx和Nginx-RTMP模块的源码:
cd /usr/local/src
sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz
sudo wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip -O nginx-rtmp-module.zip
sudo tar zxvf nginx-1.24.0.tar.gz
sudo unzip nginx-rtmp-module.zip
配置编译参数,添加RTMP模块:
cd nginx-1.24.0
sudo ./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=../nginx-rtmp-module-master
sudo make
sudo make install
创建systemd服务文件,方便管理Nginx:
sudo tee /etc/systemd/system/nginx.service << EOF
[Unit]
Description=NGINX with RTMP module
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
在Windows系统上,可以使用预编译的版本,省去编译的麻烦。
可以从GitHub上下载好心人编译好的Windows版本,或者使用以下方法:
# 1. 下载Nginx for Windows
# 从 http://nginx.org/en/download.html 下载
# 2. 下载nginx-rtmp-module
# 从 https://github.com/arut/nginx-rtmp-module 下载
# 注意:Windows版本需要特定编译,建议直接搜索现成的nginx-rtmp-win32版本
在Windows上使用Docker是更简单的方式:
docker run -d \
--name nginx-rtmp \
-p 1935:1935 \
-p 8080:8080 \
-v /path/to/nginx.conf:/etc/nginx/nginx.conf \
tiangolo/nginx-rtmp
Nginx-RTMP的配置文件是 nginx.conf,通常位于 /usr/local/nginx/conf/ 目录下。下面详细介绍各项配置。
这是一个最基本的RTMP配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
配置HLS输出,让直播流可以在网页中播放:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
hls on;
hls_path /tmp/hls;
hls_fragment 3;
hls_playlist_length 15;
hls_cleanup on;
hls_sync 100ms;
}
}
}
http {
server {
listen 8080;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
}
}
配置MPEG-DASH支持:
application live {
live on;
record off;
dash on;
dash_path /tmp/dash;
dash_fragment 2;
dash_playlist_length 10;
dash_format mp4;
}
配合FFmpeg实现实时多码率转码:
application live {
live on;
record off;
exec ffmpeg -i rtmp://localhost/live/$name
-c:v libx264 -crf 23 -preset veryfast -maxrate 2000k -bufsize 4000k -s 1280x720 -c:a aac -b:a 128k -f flv rtmp://localhost/live720/$name
-c:v libx264 -crf 23 -preset veryfast -maxrate 1000k -bufsize 2000k -s 854x480 -c:a aac -b:a 96k -f flv rtmp://localhost/live480/$name
-c:v libx264 -crf 23 -preset veryfast -maxrate 500k -bufsize 1000k -s 640x360 -c:a aac -b:a 64k -f flv rtmp://localhost/live360/$name;
}
application live720 {
live on;
record off;
hls on;
hls_path /tmp/hls/720p;
}
application live480 {
live on;
record off;
hls on;
hls_path /tmp/hls/480p;
}
application live360 {
live on;
record off;
hls on;
hls_path /tmp/hls/360p;
}
最简单的推流方式是使用FFmpeg:
# 推流本地文件
ffmpeg -re -i test.mp4 -c copy -f flv rtmp://服务器IP/live/stream1
# 推流屏幕
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset fast -pix_fmt yuv420p -f flv rtmp://服务器IP/live/stream1
OBS Studio是最流行的直播推流软件,配置方法如下:
rtmp://服务器IP/livestream1(可以自定义)使用ffplay或VLC播放RTMP流:
# FFplay播放
ffplay rtmp://服务器IP/live/stream1
# VLC播放
vlc rtmp://服务器IP/live/stream1
如果配置了HLS,也可以在浏览器中播放:
http://服务器IP:8080/hls/stream1.m3u8
HLS(HTTP Live Streaming)是Apple开发的流媒体协议,由于其基于HTTP、兼容性好的特点,被广泛用于网页直播和移动端播放。
如果追求更低的延迟,可以这样配置:
hls on;
hls_path /tmp/hls;
hls_fragment 1;
hls_playlist_length 3;
hls_sync 50ms;
hls_cleanup on;
hls_delete_threshold 3;
这样配置可以将延迟降低到3-5秒左右,但会增加服务器压力和网络开销。
Nginx-RTMP提供了强大的直播录制功能,可以将直播内容保存为视频文件。
application live {
live on;
record all;
record_path /tmp/records;
record_suffix -%Y%m%d-%H%M%S.flv;
record_unique on;
record_max_size 1000M;
record_max_files 5;
record_interval 30m;
# 录制完成后执行的脚本
exec_record_done ffmpeg -i $path -c copy /path/to/$basename.mp4;
}
Nginx-RTMP内置了统计功能,可以通过HTTP页面查看当前服务器状态和连接信息。
http {
server {
listen 8080;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /usr/local/src/nginx-rtmp-module-master/;
}
location /control {
rtmp_control all;
}
}
}
配置完成后,通过以下地址访问:
统计面板显示的信息包括:
通过control接口可以远程控制直播:
确保防火墙开放了必要的端口:
# UFW防火墙
sudo ufw allow 1935/tcp
sudo ufw allow 8080/tcp
# iptables
sudo iptables -A INPUT -p tcp --dport 1935 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
确保Nginx有HLS分片目录的写入权限:
sudo mkdir -p /tmp/hls /tmp/records
sudo chown -R www-data:www-data /tmp/hls /tmp/records
调整Nginx配置提升并发能力:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
为了防止别人随意推流,可以添加鉴权:
application live {
live on;
record off;
# 简单的URL鉴权
on_publish http://localhost/auth;
}
# HTTP验证服务(示例)
location /auth {
if ($arg_key = "your-secret-key") {
return 200;
}
return 403;
}
Nginx-RTMP是一个功能强大的开源流媒体服务器模块,通过它可以轻松搭建属于自己的直播系统。本文从模块介绍、安装部署、配置详解到功能使用,全面介绍了Nginx-RTMP的使用方法。
无论是个人直播、企业内训还是在线教育,Nginx-RTMP都能提供稳定可靠的流媒体服务。配合FFmpeg还可以实现更多高级功能,如实时转码、多码率输出等。
搭建好流媒体服务器后,你可以使用我们的 M3U8在线播放器 来测试HLS直播流的播放效果,直接在浏览器中输入HLS地址即可播放。