问题描述
为了压测公司开发的某视频服务,需要配置一个后端推流服务,以flv over http的方式进行推送,可能要承载一千个连接(512码率的视频)。
步骤
安装ffmpeg
默认给我的机子是Cent OS 7.6,系统有点陈旧,内核也有点老,一开始想直接升级成Cent OS 8,但是换了个5.x的内核导致一些依赖出错,索性直接一键DD成Debian 10(运维那边也没有现成的系统)。
1 | # 萌咖大佬的脚本 |
一键DD后的默认密码是MoeClub.org
让后换源
1 | deb http://mirrors.huaweicloud.com/debian buster main contrib non-free |
换源之后安装ca-certificates
,可以将上面的http换成https
随后安装ffmepg apt install ffmepg
,成功后验证一下,输入ffmpeg
1 | ffmpeg version 4.1.8-0+deb10u1 Copyright (c) 2000-2021 the FFmpeg developers |
ffmpeg推流
推流命令是ffmpeg -re -i ./test.flv -c copy -f flv "rtmp://<IP地址>/live/http"
,./test.flv
是flv文件的位置,"rtmp://<IP地址>/live/http"
则是推流的位置。
NGINX + nginx-http-flv-module 编译
下载NGINX 及 nginx-http-flv-module
1 | wget http://nginx.org/download/nginx-1.20.2.tar.gz |
随后编译
1 | ./configure |
安装成功后,启动nginx,输入命令/opt/nginx/sbin/nginx
,测试一下。
随后修改配置文件/opt/nginx/conf/nginx.conf
1 | worker_processes 4; |
上述<IP地址>是希望监听的地址,如可以是localhost
,或者是0.0.0.0
,又或者是局域网IP/公网IP。
出现问题
以上方案进行推流,效果不是很理想,用VLC进行播放也会存在一定程度的卡顿,猜想原因可能是nginx对flv进行了切分,且nginx默认设置的buffer太大,导致buffer满了才发,然而对nginx动手脚也不是啥好办法,且还剩四小时就要验收(接的烂摊子)着实来不及。再网上重新调研后,我认为用srs搭建这个环境可能是比较不错的选择,抱着这种心态开始了进一步的尝试。
编译srs
srs比上面的方案好折腾地多。
1 | # 直接下载最新的v4 beta 10 |
结束后,srs就会安装在/usr/local/srs
下(想换个目录就去修改Makefile中的安装目录)。
写几个小脚本控制启动、关闭和状态查看。
start.sh
1 |
|
stop.sh
1 |
|
status.sh
1 |
|
ffmpeg 推流遇到的问题
如上面所示,我一开始采用的推流,不过是重复播放一个test.flv
文件,这才另一边播放时,就会产生一个问题,会读到flv文件的末尾,导致播放器认为视频中止。
对于这个问题,可以去修改srs的源码,在复制流时去掉flv文件的头和尾,或者用一种更加方便的方案,复制别的rtmp流,推送给srs。
可见以下命令ffmpeg -i "rtmp://<某个RTMP流的IP地址>/live/http.flv" -c copy -f flv "rtmp://<IP地址>/live/http"
需要注意的时,如果ffmpeg推送了一个错误的/有问题的/空的流给srs,可能导致srs崩溃。
总结
直接糊nginx一时爽,糊完火葬场。srs部署简单,承载力也不错,经测试,完全能跑满服务器的带宽,同时对CPU和内存的占用也不大。