前言
我们知道, 直播的完整闭环核心链条是由推流端→中转端→播放端三个部分组成的:
- 推流端(采集+编码+上传):负责把现场音视频或者录制好的文件“打包装箱”,推到服务器。工具如 OBS、Kplayer、直播编码器。
- 中转端(接收+复制+分发/CDN):负责接收推流端的“货物”,然后复制成成千上万份,通过CDN广播给所有观众。比如抖音服务器、阿里云等流媒体平台。
- 播放端(拉流+解码+渲染):观众手里的设备,负责向中转端“请求拿货”,拿到后自动拆包装箱并播放。比如手机抖音App、电脑浏览器、电视大屏。
关于推流端的部署, 之前有写过相应文章介绍, 有兴趣可以参考:
今天我们来介绍如何使用Docker-compose来部署SRS中转端应用, 用于个人直播的测试
具体部署操作如下:
部署流程
假设你的机器已经安装了Docker, 关于Docker的安装, 有需要可以查看之前的文章:《ubuntu安装docker详细步骤》或者《Mac平台安装Docker》
1. 创建自定义网络
1 | docker network create c_bridge |
创建自定义网络,方便后期多容器交互。
2. 创建工作目录和数据映射目录
1 | #创建持久化数据映射目录 |
3. 创建 docker-compose.yml
由于我们直接使用现成的镜像, 所以无需Dockerfile,只需在工作目录中执行以下指令创建 docker-compose.yml文件即可:
1 | vim docker-compose.yml |
并在文件中写入以下内容:
1 | version: '3.8' |
三个端口详细介绍:
- 1935(TCP)— RTMP 推流/拉流端口
主播端(OBS、FFmpeg、摄像头、手机 SDK)把流推上来用的就是它,地址形如rtmp://你的IP:1935/live/流名。观众如果直接用RTMP播放器拉流也走这个口。也就是说在RTMP协议下, 它既充当推流口也充当拉流口 - 1985(TCP)— HTTP API 管理端口
给程序/运维用的,不是给普通观众用的。比如查版本curl http://IP:1985/api/v1/versions、查在线流、查客户端列表、做 WebRTC 信令(WHIP/WHEP)、接监控和自动化脚本都走这。浏览器直接开:1985能看到 API 返回 JSON,不是漂亮后台页面。 - 8080(TCP)— HTTP 服务端口(播放 + 控制台)干两件事:
- 发 HTTP 协议直播流:
http://IP:8080/live/流名.flv(HTTP-FLV)、http://IP:8080/live/流名.m3u8(HLS) - 内置 Web 控制台/测试播放页:浏览器开
http://IP:8080/或/console/能看到SRS自带界面、在线测试播放器。
- 发 HTTP 协议直播流:
4. 启动服务
执行以下指令会自动拉取镜像, 并按照docker-compose.yml中的配置启动容器:
1 | docker compose up -d |
-d:后台运行
执行过程中, 如果提示 docker compose 命令不存在,则需要执行以下指令安装compose插件:
1 | sudo apt-get update |
使用compose启动容器的目的无它, 就是为了方便维护, 免得时间一长忘了🤣
5. 测试服务
第一步. 在电脑端打开
OBS, 使用rtmp://srs所在IP:1935/live/test地址进行推流或者使用
ffmpeg命令行的方式, 推送桌面屏幕:1
2
3
4
5
6
7ffmpeg -f avfoundation -framerate 25 -pix_fmt nv12 -i "0:none" \
-vf "scale=854:480,fps=25,format=yuv420p" \
-c:v libx264 -preset veryfast -tune zerolatency \
-profile:v main -level 3.1 \
-b:v 700k -maxrate 700k -bufsize 1400k \
-g 50 -keyint_min 50 -sc_threshold 0 -bf 0 \
-f flv rtmp://SRS_IP:1935/live/test或者循环推送本地视频:
1
2
3
4
5ffmpeg -re -stream_loop -1 -i ./11.mp4 \
-c:v libx264 -preset veryfast -tune zerolatency -pix_fmt yuv420p \
-b:v 700k -maxrate 700k -bufsize 1400k -g 50 \
-c:a aac -b:a 64k -ac 1 -ar 44100 \
-f flv rtmp://SRS_IP:1935/live/test
- 第二步. 在电脑端或者手机打开支持直播源的播放器, 填入
rtmp://srs所在IP:1935/live/test地址看是否可以正常播放
如果正常播放, 说明部署成功, 至于播放卡顿之类的, 需要根据你服务器的带宽调整相应的码率,详见下文
关于播放卡顿
由于SRS默认不转码, 推流和播流的码率是一致的, 因此想要流畅播放, 需要确保推流码率不超过带宽, 比如你服务器是1M的出网带宽, 那么码率应设置在800-900kbps甚至500kbps, 当然了码率越低, 清晰度越差, 都是有所牺牲的
有几个概念需要理清楚:
- 上行带宽: 从电脑传出的方向, 比如我们日常上传文件到网盘, 走的是上行带宽
- 下行带宽: 传入电脑的方向, 比如我们从网上下载电影
- 出网带宽: 从服务器传出去的方向, 比如从服务器上传文件到网盘或者用户从网站下载资源, 它们走的是出网带宽
- 入网带宽: 传入服务器的方向, 比如下载
docker镜像到服务器或者用户往服务器上传文件, 或往服务器推流
那么很多人会把下行带宽和出网带宽混为一谈, 同样是下载文件, 但是动作视角不同, 将电脑/服务器当成第一人称视角, 你会发现, 下行带宽和入网带宽是一个意思, 上行带宽和出网带宽是一个意思.
以阿里云1M带宽服务器为例, 这个1M指的是出网带宽, 而不是入网带宽,入网带宽一般会比出网带宽高, 通常在10M左右乃至更高, 方便用户在服务器下载软件部署服务
由于我们在直播闭环中涉及到推流端→中转端→播放端三个端的协作, 所以我们在推流的时候, 需要考虑三个端的带宽, 假设使用本地的OBS推流, 那么需要考虑本地网络的上行带宽以及中转服务器的入网带宽, 而观众在手机上播放直播时需要考虑到本地网络的下行带宽以及中转服务器的出网带宽.
所以, 视频播放卡顿, 有可能出在推流或者服务器那边, 也有可能出在观众那边, 观众的带宽层次不齐我们没法控制, 我们只需要调整推流端和中转端的传输码率, 以确保流畅度即可
因此, 在中转端不进行转码的情况下, 码率设置如下:
- OBS推流码率: 本地网络的上行带宽和中转服务器的入网带宽以及中转服务器的出网带宽, 三者取最小值设置
如果中转端会进行转码, 码率设置如下:
- OBS推流码率: 本地网络的上行带宽和中转服务器的入网带宽, 两者取最小值设置
- 转码输出码率: 不超过中转服务器的出网带宽
如果想要开启SRS的转码功能, 需要在SRS的conf配置文件中的加入以下配置:
1 | transcode { |
关于浏览器播放
如果你不想到处安装RTMP播放器, 希望能任意浏览器直接播放, 那么我们可以专门写一个前端页面放置在SRS的html目录下
在/root/srs/data目录下创建index.html文件, 并将以下内容写入到该文件中(记得要替换掉代码中的主机地址和端口号):
1 |
|
此时在浏览器中输入http://中转服务器IP:8088/即可实现浏览器观看直播

如果使用ffmpeg推流时浏览器可以正常播放, 但是换成OBS推流却播放不了, 那问题大概率出在OBS直播配置上, 需要在直播设置→输出→高级输出模式页面中, 在x264选项栏中填入以下内容, 用于兼容浏览器设备:
1 | keyint=50:min-keyint=50:scenecut=0:bframes=0:profile=main:pix_fmt=yuv420p |

本文为作者原创 转载时请注明出处 谢谢
