本篇文章,我们详细介绍下使用SRS来部署一套流媒体服务器,并用FFmpeg来推流,VLC来拉流。
系统环境基于Centos7、Ubuntu21.10
一、非gb28181版本的SRS
1.下载srs源码、安装
(1)下载
github官网 https://github.com/ossrs/srs
直接下载release版本的gz压缩文件,或者git clone源文件。
https://github.com/ossrs/srs/releases
git clone -b 4.0release https://gitee.com/ossrs/srs.git SRS-4.0.0
直接将源文件下载到指定目录 SRS-4.0.0
(2)解压压缩包
tar xvf srs-server-4.0-b10.tar.gz
2.编译
(1)创建build目录,用来存放编译好的srs程序
cd srs-server-4.0-b10/trunk/
mkdir build
(2)config & make
configure比较花时间。编译参考 https://github.com/ossrs/srs/wiki/v1_CN_Build
./configure --prefix=/opt/srs/srs-server-4.0-b10/trunk/build --full && make && make install
编译时指定开启功能
./configure --help 查看编译帮助信息。
SRS提供了详细的编译选项来控制功能的开关,以及提供了一些有用的预设功能,可以针对不同的应用场景使其具备不同的默认选项。
比如
./configure --gb28181=on 默认开启。主支版本SRS开启gb功能不完善,存在gb推流注册成功,无法invite拉流问题。如果使用晚上gb功能,需要使用SRS的gb分支。
比如
./configure
--with-ingest 开启ingest采集数据流,默认不开启
SRS的配置(configure)参数说明如下:
- --help 配置的帮助信息
- --with-ssl 添加ssl支持,ssl用来支持复杂握手。参考:RTMP Handshake。
- --with-hls 支持HLS输出,将RTMP流切片成ts,可用于支持移动端HLS(IOS/Android),不过PC端jwplayer也支持HLS。参考:HLS
- --with-dvr 支持将RTMP流录制成FLV。参考:DVR
- --with-nginx 编译nginx,使用nginx作为web服务器分发HLS文件,以及demo的静态页等。
- --with-http-callback 支持http回调接口,用于认证,统计,事件处理等。参考:HTTP callback
- --with-http-api 打开HTTP管理接口。参考:HTTP API
- --with-http-server 打开内置HTTP服务器,支持分发HTTP流。参考:HTTP Server
- --with-ffmpeg 编译转码/转封装/采集用的工具FFMPEG。参考:FFMPEG
- --with-transcode 直播流转码功能。需要在配置中指定转码工具。参考:FFMPEG
- --with-ingest 采集文件/流/设备数据,封装为RTMP流后,推送到SRS。参考:Ingest
- --with-stat 是否开启数据统计功能,SRS可以采集cpu/内存/网络/磁盘IO等数据,供监控系统通过http-api获取。(目前osx不支持)。
- --with-research 是否编译research目录的文件,research目录是一些调研,譬如ts info是做HLS时调研的ts标准。和SRS的功能没有关系,仅供参考。
- --with-utest 是否编译SRS的单元测试,默认开启,也可以关闭。
- --with-gperf 是否使用google的tcmalloc库,默认关闭。
- --with-gmc 是否使用gperf的内存检测,编译后启动srs会检测内存错误。这个选项会导致低性能,只应该在找内存泄漏时才开启。默认关闭。参考:gperf
- --with-gmp 是否使用gperf的内存性能分析,编译后srs退出时会生成内存分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gperf
- --with-gcp 是否启用gperf的CPU性能分析,编译后srs退出时会生成CPU分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gperf
- --with-gprof 是否启用gprof性能分析,编译后srs会生成CPU分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gprof
- --with-librtmp 客户端推流/播放库,参考srs-librtmp
- --with-arm-ubuntu12 交叉编译ARM上运行的SRS,要求系统是Ubuntu12。参考srs-arm
- --jobs[=N] 开启的编译进程数,和make的-j(--jobs)一样,在configure时可能会编译nginx/ffmpeg等工具,可以开启多个jobs编译,可以显著加速。参考:Build: jobs
- --static 使用静态链接。指定arm编译时,会自动打开这个选项。手动编译需要用户自身打开。参考:ARM
预设集:
- --x86-x64,默认预设集,一般的x86或x64服务器使用。release使用这个配置编译。
- --osx,苹果MAC OSX(Darwin)系统下编译,安装好xcode和brew后,可以使用这个选项。
- --pi,树莓派预设集,arm的子集。树莓派的release用这个配置编译。
- --cubie,在cubieboard下直接编译的选项,使用ubuntu差不多的配置集。
- --arm,ubuntu下交叉编译,等价于--with-arm-ubuntu12。release使用这个配置。
- --mips,ubuntu下交叉编译,为hiwifi的mips路由器编译。(目前srs在mips上有内存泄漏,2天左右会把路由器跑死)。
- --dev,开发选项,尽可能开启功能。
- --fast,关闭所有功能,只支持基本RTMP(不支持h264/aac),最快的编译速度。
- --pure-rtmp,支持RTMP(支持h264+aac),需要编译ssl。
- --rtmp-hls,支持RTMP和HLS,典型的应用方式。还可以加上内置的http服务器(--with-http-server)。
- --disable-all, 禁用所有功能,只支持rtmp(vp6)。
- --demo,SRS的演示编译选项。
- --full,开启SRS所有的功能。
专家选项:有可能编译失败,不是专家就不要用这个。
- --use-sys-ssl 使用系统的ssl,不单独编译ssl(在--with-ssl时有效)。
注:make过程中出现错误及解决方法
In file included from ../../../objs/gtest/include/gtest/internal/gtest-port.h:197:0,
from ../../../objs/gtest/include/gtest/internal/gtest-internal.h:40,
from ../../../objs/gtest/include/gtest/gtest.h:57,
from ../../../src/utest/srs_utest.hpp:36,
from ../../../src/utest/srs_utest.cpp:24:/usr/include/c++/7/sstream:300:7: error: ‘struct std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc>::__xfer_bufptrs’
redeclared with different access struct __xfer_bufptrs
./configure --prefix=/opt/srs/srs-server-4.0-b10/trunk/build --full --without-utest
make
make install make和make install 选择一个就行
3.配置文件
配置文件存放位置:/opt/srs/srs-server-4.0-b10/trunk/build/conf/
/opt/srs/srs-server-4.0-b1/objs/srs -v 查看服务器版本
/opt/srs/srs-server-4.0-b1/objs/srs -t -c conf/srs.conf 测试配置文件是否正确
/opt/srs/srs-server-4.0-b1/objs/srs -c conf/srs.conf 指定以此配置文件启动srs
如果要查看配置项的含义,可以查看full.conf文件查看具体含义。conf文件夹有各种流的配置文件示例,当需要指定流时可以参考。
(1)srs.conf配置文件 支持rtmp、rtc、hls
如下为srs.conf配置文件,其配置端口如下:
- 1935端口对应的是rtmp服务
- 1985端口对应http api访问端口,也是打开控制台页面的端口 ,进一步了解 v4_CN_HTTPApi · ossrs/srs Wiki · GitHub
- 8080端口对应的是http-flv 、hls流播放端口,在线播放器web页面端口。
相关配置项:http callback v4_CN_HTTPCallback · ossrs/srs Wiki · GitHub 、https flv live stream v4_EN_DeliveryHttpStream · ossrs/srs Wiki · GitHub
# main config for srs.
# @see full.conf for detail config.
listen 1935;
max_connections 1000;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
hls {
enabled on;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtmp-to-rtc
rtmp_to_rtc off;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtc-to-rtmp
rtc_to_rtmp off;
}
}
4.webrtc 推拉流
(1)支持rtc功能的配置文件rtmp2rtc.conf
特别注意:如果是公网, $CANDIDATE需要改成公网ip
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
http_api {
enabled on;
listen 1985;
}
stats {
network 0;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate
candidate $CANDIDATE; //特别注意:如果是公网,需要改成公网ip
}
vhost __defaultVhost__ {
rtc {
enabled on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtmp-to-rtc
rtmp_to_rtc on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtc-to-rtmp
rtc_to_rtmp on;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
(3)webrtc拉流
ffmpeg推流
ffmpeg.exe -stream_loop -1 -re -i sample.flv -c copy -f flv rtmp://192.168.41.118/live/2
SRS在线播放器
srs会将rtmp流转成webrtc流,打开在线播放器,然后输入webrtc地址播放即可 webrtc://192.168.41.118/live/2
注意
如果ffmpeg已经推流,rtmp播放没问题,但是webrtc 拉流播放时黑屏。可能是因为candidate没有设置为公网ip导致的,在公网播放webrtc时, $CANDIDATE只能取得内网地址,取不到公网地址,因此必须明确指定公网ip。【 $CANDIDATE就是ifconfig命令取得的本机ip地址,此命令取不到本机的公网ip地址】
(4)webrtc推流
打开在线播放器RTC推流,就会直接推本地摄像头视频流 webrtc://192.168.41.118/live/livestream,然后RTC播放器可以播放 webrtc://192.168.41.118/live/livestream,SRS播放器也可以播放 http://192.168.41.118:8080/live/livestream.flv。【srs会把推流转成各种格式的流】
RTC推流失败
打开在线播放器直接推本地摄像头视频流,控制台会报错并alert提示。
解决方案:
在浏览器地址栏中输入“chrome://flags/#unsafely-treat-insecure-origin-as-secure”,回车,如下图,将该选项置为Enabled,然后在输入框中输入需要访问的地址,多个地址使用“,”隔开,然后点击右下角弹出的Relaunch按钮,自动重启浏览器之后就可以在添加的http地址下调用摄像头和麦克风了。
访问地址端口为http api 设置的端口,也就是当前打开的web页面的端口。
5.启动 srs
(1)cd /opt/srs/srs-server-4.0-b10/trunk/build
(2)sudo ./objs/srs -c ./conf/srs.conf
(3)./etc/init.d/srs status 查看srs状态
(4)tail -n 30 -f ./objs/srs.log 查看srs日志
启动后可访问的web页面
1.播放器页面 http://192.168.41.118:8080/ ,端口号在配置文件查看
2.控制台页面
http://192.168.41.118:1985/console/ng_index.html 端口号如下查看。可以查看视频流、srs服务器状态等。
关闭srs
(1) ps
查出pid 然后 kill -9 2405
root@ubuntuxiaomi:/opt/srs/srs-server-4.0-b10/trunk/conf# ps -ef | grep srs root 2405 1233 1 May01 pts/0 00:06:08 ./objs/srs -c conf/rtmp2rtc.conf root 952136 5045 0 03:23 pts/4 00:00:00 grep --color=auto srs
(2)srs.pid文件存放pid ,然后kill -9 pid
cat /opt/srs/srs-server-4.0-b10/trunk/objs/srs.pid 2405
6.ffmpeg推流
推流命令
ffmpeg -stream_loop -1 -v verbose -re -i sample_yuancore_720p.mp4 -f flv rtmp://192.168.41.115:1935/rtmp_live/mystream
-stream_loop -1 无限循环推流
-v verbose 详细日志
-re 本来的码率推流
-c:a copy -c:v copy 省略 按照原来编码推流
推流后srs生成可以播放的流地址
生成下面的播放流(若SRS不在本机,请将localhost更换成服务器IP):
- RTMP (by VLC): rtmp://localhost/live/livestream 使用vlc播放
- H5(HTTP-FLV): http://localhost:8080/live/livestream.flv 使用vlc播放或srs web页面播放
- H5(HLS): http://localhost:8080/live/livestream.m3u8 使用vlc播放
注意如果RTMP转WebRTC流播放,必须使用配置文件rtmp2rtc.conf:
- H5(WebRTC): webrtc://localhost/live/livestream srs web页面播放
生成的 m3u8 和 ts 文件路径
/opt/srs/srs-server-4.0-b10/trunk/build/objs/nginx/html/rtmp_live
7.播放流
- VLC拉流 RTMP、HTTP-FLV、HLS可以使用VLC播放
- SRS 在线播放器web页面 可以播放HTTP-FLV、WebRTC、GB28181三种流
注:如果拉流rtmp时,使用1935默认端口可以省略端口。
VLC、ffplay播放
VLC 直接输入地址即可播放、ffplay -i rtmp://ip:port/myapp/1 播放
srs在线播放器
在线播放器web页面 http://192.168.41.118:8080/ ,端口号在配置文件查看
- SRS播放器播放flv地址、RTC播放器播放webrtc流。
- gb28181地址 http://192.168.41.118:5080/players/srs_gb28181.html
- 打开web页面后,其中 API地址与端口选项填写 http://114.255.88.234:5891 5891为配置文件指定的http接口端口
- 可以查看所有连接此srs的gb28181设备和通道。可直接播放通道。
二、gb28181版本的SRS
SRS 目前把GB的SIP支持从SRS中移除,只支持媒体处理部分。GB独立发展。仓库为 https://github.com/ossrs/srs-gb28181
所谓的国标GB28181协议大家简单理解为SIP+RTP即可,所以SRS为了支持视频监控行业设备上云,还是要支持国标GB28181协议。 如果把SIP信令和RTP流处理代码都集成在SRS里面实现,违反了SRS的简单原则,其次信令这块对接起来非常麻烦,虽然是国家标准,但是各个厂家实现的不标准,有很多细小问题需要接入方来兼容,其次这块还有大量业务在里面,所以SRS不应该去完整实现GB协议信令部分,只需要实现RTP流部分即可,换句话说只要能摄像头接进来,能把媒体流从RTP转分发为RTMP、HLS等即可。信令部分只需要提供基本的测试接入部分即可,目的只是为了SRS能跑起来,信令部分还是需要使用SRS的同学们自己实现,媒体部分会提供RestFul接口供信令调用。
是否支持gb的issue GB28181: I'm thingking about saying goodbye,我在想是否不支持 · Issue #2845 · ossrs/srs · GitHub
gb参考文档 srs_code_note/srs_gb28181.md at master · xialixin/srs_code_note · GitHub
1.下载源码
git clone https://github.com/ossrs/srs-gb28181.git
2.编译
cd /opt/srs/srs-gb28181/trunk && mkdir build
./configure --prefix=/opt/srs/srs-gb28181/trunk/build --gb28181=on && make && make install
3.启动
./objs/srs -c conf/push.gb28181.tcp.conf
查看serial id
4.推gb流
GBtDevice 推手机gb28181协议视频流到SRS。如下,服务器id填写serial id。用户id随意填写,用户密码如果配置文件未指定,随便填写。
5.播放gb流
访问SRS web页面,进入播放器页面。http://192.168.41.252:8080/
6.其他协议拉流
一旦发现摄像头推流上来,则可以用RTMP拉流协议进行拉流验证
RTMP的URL:
rtmp://114.115.221.185:1935/live/78978201001320000001
地址参考配置文件。其中IP为SRS的外网IP,端口用1935默认,这些参考配置文件即可,app用live,stream用设备端的用户ID。当然rtmp的url中app也可以修改。
如果你还想测试其它协议分发情况,只要在编译SRS和配置时生效即可,详见wiki。