在Linux环境下搭建流媒体服务器是许多企业和个人开发者的常见需求,尤其需要处理视频、音频等多媒体内容的实时传输和存储,本文将详细介绍使用开源软件搭建流媒体服务器的步骤,包括环境准备、软件安装、配置优化及测试验证,并结合表格对比不同方案的特点,最后附上常见问题解答。

环境准备与系统要求
首先需要选择合适的Linux发行版,推荐使用Ubuntu 20.04或CentOS 8,这两者拥有完善的软件包管理和社区支持,硬件方面,根据并发流量的需求,建议至少配备4GB内存、双核CPU及500GB以上存储空间,若涉及高清视频转码,则需考虑GPU硬件加速,网络环境需保证足够的带宽,例如同时支持100路1080P视频流时,至少需要100Mbps的上行带宽。
软件选择与安装
主流的流媒体服务器方案包括Nginx-RTMP、SRS及Wowza,其中Nginx-RTMP因轻量级和高扩展性成为常用选择,以下以Ubuntu系统为例,介绍Nginx-RTMP的搭建过程:
-
依赖安装:执行
sudo apt update更新系统后,安装编译所需的依赖包:sudo apt install -y build-essential libpcre3 libpcre3-dev openssl libssl-dev
-
下载Nginx及RTMP模块:从官方仓库获取Nginx源码及RTMP模块:
(图片来源网络,侵删)wget http://nginx.org/download/nginx-1.18.0.tar.gz git clone https://github.com/arut/nginx-rtmp-module.git tar -xzf nginx-1.18.0.tar.gz
-
编译与安装:进入Nginx目录并配置编译参数,加入RTMP模块:
cd nginx-1.18.0 ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module make && sudo make install
配置RTMP服务
编辑Nginx配置文件/usr/local/nginx/conf/nginx.conf,在末尾添加RTMP服务配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
hls on;
hls_path /tmp/hls;
hls_fragment 3s;
}
}
}
http {
server {
listen 80;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
}
}
}
上述配置中,RTMP服务监听1935端口,推流地址为rtmp://your_server_ip/live/stream_key,同时启用HLS协议,将流转换为m3u8和ts文件供HTTP拉流。
启动服务与测试
启动Nginx服务并设置开机自启:

sudo /usr/local/nginx/sbin/nginx sudo echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
使用FFmpeg工具测试推流:
ffmpeg -re -i test.mp4 -c copy -f flv rtmp://your_server_ip/live/stream_key
在VLC播放器中输入拉流地址rtmp://your_server_ip/live/stream_key或HLS地址http://your_server_ip/hls/stream_key.m3u8,验证是否正常播放。
不同方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Nginx-RTMP | 轻量级、配置简单、支持HLS/RTMP | 不支持DRM保护 | 中小型直播平台 |
| SRS | 支持WebRTC、集群扩展 | 配置复杂、文档较少 | 高并发、低延迟场景 |
| Wowza | 功能全面、支持DRM | 商业软件、价格昂贵 | 企业级流媒体服务 |
相关问答FAQs
Q1: 如何优化流媒体服务器的延迟问题?
A1: 延迟优化可通过以下方式实现:1) 使用RTMP协议代替HLS,因RTMP基于TCP,延迟通常在1-3秒;2) 调整Nginx配置中的chunk_size参数至更小值(如128);3) 部署边缘节点,将流分发至离用户更近的服务器;4) 启用SRS的WebRTC协议,延迟可降至500ms以内。
Q2: 流媒体服务器如何实现防盗链?
A2: 可通过Nginx的HTTP模块配置防盗链:1) 在http块中设置valid_referers允许的域名;2) 使用$http_referer变量拦截非法请求;3) 结合token认证,在推流URL中添加动态密钥,服务器端验证密钥有效性。
location /hls {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
} 