SRS 的部署

本篇文章,我们详细介绍下使用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转WebRTC流播放,必须使用配置文件rtmp2rtc.conf:

生成的 m3u8 和 ts 文件路径

/opt/srs/srs-server-4.0-b10/trunk/build/objs/nginx/html/rtmp_live

7.播放流

  1. VLC拉流  RTMP、HTTP-FLV、HLS可以使用VLC播放
  2. 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
  1. 打开web页面后,其中 API地址与端口选项填写 http://114.255.88.234:5891 5891为配置文件指定的http接口端口
  2. 可以查看所有连接此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。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值