如何使用Nginx搭建HLS流媒体服务器

准备条件

在搭建HLS流媒体服务器之前,请确保具备以下条件:

  • 一台运行 Ubuntu 20.04+Debian 11+ 的服务器,拥有root权限
  • 一个指向服务器的域名(生产环境推荐)
  • 基本的Linux命令行操作知识
  • 至少2GB内存和20GB可用磁盘空间

HLS(HTTP Live Streaming)允许您通过标准HTTP协议提供视频服务,并支持自适应码率,实现跨设备和网络条件下的流畅播放。

安装带RTMP模块的Nginx

RTMP模块使Nginx能够通过RTMP协议接收直播视频流,并实时转换为HLS格式。您可以选择从源码编译或使用预编译包安装。

方案一:通过包管理器安装(Ubuntu/Debian)

sudo apt update

                        sudo apt install nginx libnginx-mod-rtmp -y

方案二:从源码编译安装

sudo apt install build-essential libpcre3-dev libssl-dev zlib1g-dev -y

                        git clone https://github.com/arut/nginx-rtmp-module.git

                        wget http://nginx.org/download/nginx-1.24.0.tar.gz

                        tar -xzf nginx-1.24.0.tar.gz

                        cd nginx-1.24.0

                        ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module

                        make && sudo make install

安装完成后,使用 systemctl status nginx 验证Nginx是否正常运行。

配置Nginx支持HLS

编辑 /etc/nginx/nginx.conf 文件,添加RTMP和HLS配置块。此配置同时支持直播和点播功能,并包含正确的CORS响应头以支持跨域访问。

rtmp {

                            server {

                                listen 1935;

                                chunk_size 4096;

                                application live {

                                    live on;

                                    record off;

                                    hls on;

                                    hls_path /var/www/html/hls;

                                    hls_fragment 3;

                                    hls_playlist_length 60;

                                }

                            }

                        }

                        http {

                            server {

                                listen 80;

                                server_name your-domain.com;

                                location /hls {

                                    types {

                                        application/vnd.apple.mpegurl m3u8;

                                        video/mp2t ts;

                                    }

                                    root /var/www/html;

                                    add_header Cache-Control no-cache;

                                    add_header 'Access-Control-Allow-Origin' '*';

                                    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

                                }

                            }

                        }

配置完成后重启Nginx:sudo systemctl restart nginx。CORS响应头对于像本播放器这样的Web播放器访问HLS流至关重要。

使用FFmpeg推流

FFmpeg是业界标准的视频编码和推流工具。使用以下命令推送直播流或将现有视频转换为HLS格式。

推送RTMP直播流到服务器:

ffmpeg -re -i input.mp4 \

                          -c:v libx264 -preset veryfast -b:v 3000k \

                          -c:a aac -b:a 128k -f flv \

                          rtmp://your-server-ip/live/stream

直接转换点播文件为HLS分片:

ffmpeg -i video.mp4 \

                          -c:v libx264 -c:a aac \

                          -hls_time 6 -hls_list_size 0 \

                          -hls_segment_filename 'segment_%03d.ts' \

                          output.m3u8

对于自适应码率流,需要编码多个画质级别,并创建一个引用各档位播放列表的主播放列表(Master Playlist)。

测试您的流

服务器配置好并开始推流后,使用我们的免费 M3U8播放器 进行测试:

  1. 访问 M3U8播放器
  2. 输入您的HLS地址(例如 https://your-domain.com/hls/stream.m3u8
  3. 点击播放按钮或按回车键
  4. 播放器将以自适应码率加载您的流

您也可以使用VLC、ffplay或其他HLS兼容播放器进行测试。如果播放失败,请检查防火墙(需开放80和1935端口)、Nginx错误日志和CORS响应头配置。

生产环境建议配置SSL/TLS(使用Let's Encrypt),并为RTMP端点添加认证保护。更多故障排除信息请参见 故障排除指南

相关文章

📚 关于 M3U8 与 HLS

学习M3U8播放列表和HLS流媒体的基础知识。掌握自适应码率、多码率播放列表、.ts分片,并理解M3U8与MP4的区别。

🔧 故障排除指南

修复常见的HLS服务器问题,包括CORS配置错误、缓冲问题、.ts分片404错误以及权限和所有权问题。

❓ 常见问题解答

获取14个常见M3U8和HLS问题的答案,涵盖CORS修复、自适应码率、DRM支持、延迟降低和播放器嵌入方法。

🎬 M3U8 与 MPEG-DASH 对比

比较HLS和MPEG-DASH流媒体协议。了解编解码器支持、DRM生态系统、延迟性能以及如何选择适合您需求的协议。