RTMP协议在直播领域应用非常广泛,虽然它诞生至今已有二十多年,但凭借延迟低、生态成熟、推流端支持完善等特点,仍然是众多推流软件和流媒体服务器的默认选择。在Windows系统上搭建一个RTMP服务器并不复杂,核心工作就是部署一个带RTMP模块的nginx,再配好推流地址和播放地址。本文以最常用的nginx for Windows加nginx-rtmp-module方案为例,完整走一遍搭建、推流、拉流的全流程,并总结几个最容易出错的地方。

一、准备工作:下载带RTMP模块的nginx
原生nginx官方版本并不包含RTMP模块,Windows下自行编译模块比较麻烦,推荐直接下载别人编译好的集成版本。常见的选择是nginx with rtmp module的Windows编译包,解压即可用,不需要安装。下载后把它解压到一个路径简单的目录,比如C:\nginx-rtmp,注意尽量避免中文路径和带空格的路径,否则后续启动和配置都可能出问题。
解压完成后目录结构大致如下:主程序在C:\nginx-rtmp\nginx.exe,配置文件在C:\nginx-rtmp\conf\nginx.conf,日志在C:\nginx-rtmp\logs目录,缓存和临时文件在C:\nginx-rtmp\temp目录。先打开命令提示符,切换到该目录执行nginx.exe -v,如果能看到版本号输出,说明程序本身可以正常运行。
除了服务器,还需要准备两个客户端工具:推流端推荐OBS Studio,免费且功能完整;拉流端推荐VLC媒体播放器,对RTMP协议支持较好。这两个工具都是跨平台的,安装过程一路下一步即可。
二、配置RTMP服务并启动nginx
打开C:\nginx-rtmp\conf\nginx.conf,在配置文件中追加RTMP配置块。一个最基础可用的配置如下:
rtmp {
server {
listen 1935; # RTMP默认端口
chunk_size 4096; # 数据分块大小
application live {
live on; # 开启直播模式
record off; # 关闭录制
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 8080; # HTTP端口,用于状态页
location /stat {
rtmp_stat all; # 输出流状态信息
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
}
}
配置里有几个关键点需要理解。listen 1935是RTMP协议的标准端口,推流端和拉流端都通过这个端口通信;application live定义了一个名为live的应用,它会成为流地址的一部分;live on表示这个应用工作在直播模式,收到推流后立即分发给观看者,不做存储。/stat这个location提供了一个HTTP状态页,浏览器访问http://127.0.0.1:8080/stat就能看到当前有哪些流在推送,排查问题时非常有用。
配置保存后,在命令提示符中进入C:\nginx-rtmp目录,执行start nginx启动服务。验证方法是在任务管理器中查看是否有nginx.exe进程,或者用netstat -ano | findstr 1935确认端口处于监听状态。如果修改了配置,执行nginx.exe -s reload可以平滑重载;要停止服务则执行nginx.exe -s stop。
三、使用OBS推流并用VLC拉流验证
先进行推流。打开OBS Studio,在左下角的来源区域添加一个采集源,比如窗口采集或摄像头。然后进入设置,选择流类别,服务类型选自定义,服务器填写rtmp://127.0.0.1:1935/live,串流密钥填test。点击开始推流后,OBS下方的状态栏会显示绿色已连接,表示推流成功。
这里的地址规则要弄清楚:完整流地址由服务器地址、应用名、流密钥三部分拼接而成。服务器是rtmp://127.0.0.1:1935,应用名是配置文件里的live,密钥是自己随便起的test,那么拉流地址就是rtmp://127.0.0.1:1935/live/test。推流地址和拉流地址本质上是同一个,只是使用方向不同。
拉流验证用VLC。打开VLC,选择媒体菜单下的打开网络串流,输入rtmp://127.0.0.1:1935/live/test,点击播放。如果一切正常,几秒内就能看到OBS推送的画面。想在其他设备比如手机或局域网内另一台电脑上观看,把地址中的127.0.0.1换成这台服务器的局域网IP即可,可通过ipconfig命令查到。也可以用ffplay做快速验证:
ffplay rtmp://192.168.1.100:1935/live/test
四、常见错误与解决方法
第一个高频问题是nginx启动后马上退出,或者端口监听失败。多数情况是8080端口或1935端口被占用,用netstat -ano | findstr 8080查到占用进程的PID,再到任务管理器里结束对应进程。也可能是配置文件有语法错误,执行nginx.exe -t可以检测配置,会明确指出出错行号。另外注意nginx的工作目录必须是C:\nginx-rtmp,如果在别的目录执行nginx.exe,会找不到相对路径下的配置文件。
第二个问题是OBS推流报无法连接服务器。先检查地址拼写,协议必须是rtmp开头,端口和斜杠都不能少,地址末尾不要多加流密钥。再检查Windows防火墙,第一次启动时如果弹出了防火墙允许提示而选择了取消,1935端口就会被拦截,需要到控制面板的Windows Defender防火墙中找到允许应用通过防火墙,勾选nginx的专用和公用网络,或者直接新增一条入站规则放行1935端口。
第三个问题是VLC拉流时黑屏或者一直缓冲。常见原因有三类:一是拉流时推流已经停止,RTMP是实时流,没有推流就没有内容可看,可以访问http://127.0.0.1:8080/stat确认流是否在线;二是密钥不匹配,推流密钥是test,拉流地址也必须是live/test;三是编码参数问题,如果推流端使用了某些特殊编码,老版本播放器可能解不出来,建议推流端使用H.264编码,兼容性最好。
最后是卡顿和延迟偏高的问题。延迟在几秒内属于RTMP的正常范围,如果延迟明显偏大,可以适当降低OBS中的关键帧间隔,一般设为2秒;卡顿则多半是带宽或CPU不足,可降低输出分辨率和码率,比如720p加2500kbps是比较稳妥的组合。服务器方面可以把chunk_size调大一些,减少数据交互次数,但不宜超过8192。
五、总结
整套流程归纳起来就三步:部署带RTMP模块的nginx到C:\nginx-rtmp,写好rtmp配置块并监听1935端口,用OBS推流到rtmp://服务器IP:1935/live/密钥,再通过相同地址拉流观看。掌握流地址的拼接规则和stat状态页的使用方法后,大部分问题都能快速定位。如果后续需要录制、转码或多协议分发,可以在现有配置上继续扩展hls模块或者接入SRS等更强大的流媒体服务器,Windows平台的这套基础环境完全够用起步。
RTMP服务器Windows推流nginx-rtmpOBS推流VLC拉流修改时间:2026-09-07 09:38:47