webrtc-streamer

使用开源组件webrtc-streamer快速推送RTSP流视频

参考链接:

https://github.com/mpromonet/webrtc-streamer

https://www.bilibili.com/read/cv14070290/

1. 下载release包至服务器中:(将包放置于/iot目录下)

地址: https://github.com/mpromonet/webrtc-streamer/releases (webrtc-streamer-v0.7.0-Linux-x86_64-Release.tar.gz)

2. 更改名称并解压包

1
2
3
4
tar -zxvf webrtc-streamer-v0.7.0-Linux-x86_64-Release.tar.gz

mv webrtc-streamer-v0.7.0-Linux-x86_64-Release webrtc-streamer

3. 测试包是否正常使用

在/iot/webrtc-streamer/ 执行 (IP端口需要手动指定,ip为当前服务器ip,port默认写29000,如果被占用则选其他)

/iot/webrtc-streamer/webrtc-streamer -H ip:port

并查看run.log查看日志

如果出现如下字样则表示成功:

3. 自定义系统服务

  1. 进入目录 cd /etc/systemd/system/
  2. 编写属于自己的unit文件,命令为webrtc-streamer.service,整个文件如下: (第9行需要改为部署机器的IP和指定的未占用端口)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Unit]

Description=WebRTC Streamer Service

[Service]

Type=simple

ExecStart=nohup /iot/webrtc-streamer/webrtc-streamer -H 192.168.35.195:29000 > /dev/null 2>&1 &

Restart=always

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

  1. 将上述的文件拷贝到 /usr/lib/systemd/system/*目录下
  2. 将my-demo.service注册到系统当中执行命令:systemctl enable webrtc-streamer.service
  3. 至此服务已经创建完成。重新启动系统,检查服务是否正常启动,服务在开机时启动成功则功能完成。

附录:

启动:systemctl start wreamer.service

结束:systemctl stop webrtc-streamer.service

重启:systemctl restart webrtc-streamer.service

状态:systemctl status webrtc-streamer.service

列出所有可用单元:systemctl list-unit-files

列出所有运行中单元:systemctl list-units

列出所有失败单元:systemctl –failed

使用systemctl命令杀死服务:systemctl kill webrtc-streamer.service

服务启动失败时:

  1. 直接使用nohup /iot/webrtc-streamer/webrtc-streamer -H ip:port > run.log 2>&1 & 命令直接执行,并查看run.log查看日志
  2. version `GLIBC_2.27‘ not found

参考链接: http://dljz.nicethemes.cn/news/show-299309.html

服务启动规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
./webrtc-streamer [-H http port] [-S[embeded stun address]] -[v[v]]  [urls...]
./webrtc-streamer [-H http port] [-s[external stun address]] -[v[v]] [urls...]
./webrtc-streamer -V
-v[v[v]] : verbosity
-V : print version
-C config.json : load urls from JSON config file
-n name -u videourl -U audiourl : register a name for a video url and an audio url
[url] : url to register in the source list

-H [hostname:]port : HTTP server binding (default 0.0.0.0:8000)
-w webroot : path to get files
-c sslkeycert : path to private key and certificate for HTTPS
-N nbthreads : number of threads for HTTP server
-A passwd : password file for HTTP server access
-D authDomain : authentication domain for HTTP server access (default:mydomain.com)

-S[stun_address] : start embeded STUN server bind to address (default 0.0.0.0:3478)
-s[stun_address] : use an external STUN server (default:stun.l.google.com:19302 , -:means no STUN)
-T[username:password@]turn_address : start embeded TURN server (default:disabled)
-t[username:password@]turn_address : use an external TURN relay server (default:disabled)
-R [Udp port range min:max] : Set the webrtc udp port range (default 0:65535)
-W webrtc_trials_fields : Set the webrtc trials fields (default:WebRTC-FrameDropper/Disabled/)
-a[audio layer] : spefify audio capture layer to use (default:0)
-q[filter] : spefify publish filter (default:.*)
-o : use null codec (keep frame encoded)

docker

  1. 启动
1
2
# -o 关闭编解码,优化CPU占用(支持源为H.264),端口自定义
docker run -d --rm --name webrtc-stream --network=host mpromonet/webrtc-streamer -o -H 0.0.0.0:18888
  1. 关闭
1
docker stop  webrtc-steram
  1. 查看日志
1
docker logs -f webrtc-stream

流媒体选型

一. 基本配置和功能比较

选型维度 SRS ZLMedia EasyDarwin
功能满足度 支持网络设备摄像头接入,支持RTSP,RPMP,GB28181协议接入。并提供了RestFul API提供给外部调用。 支持网络设备摄像头接入,支持RTSP,RPMP,GB28181协议接入。提供了RestFul API提供给外部调用。 支持RTSP,RTMP协议接入。提供了可配置的前端界面,但没有API接口文档。
社区活跃度 最佳,github上issue未解决/总数比例(281/1800),star数14.1K,有相应的群可以讨论技术问题。 佳,github上issue未解决/总数比例(23/850),star数4k。 一般,github上issue未解决/总数比例(89/200)
版本维护 佳,一直在按照开源计划持续更新 佳,一直在按照开源计划持续更新 差,两年没有进行更新
文档 github wiki形式提供,根据版本进行文档迭代,文档较全 github wiki形式提供,文档较全 文档基本上只有Readme
授权 开源 开源 开源
学习成本 基于C++进行开发,之前项目中已进入应用,在使用方面可以迅速上手。 基于C++进行开发,需要对照文档进行功能使用。 基于Golang进行开发,需要对照文档进行功能使用。
集群支持 支持集群 支持集群 不支持集群
商业维护机构 BAT等在职开发人员开源,无商业维护机构 流媒体服务爱好者开源,无商业维护机构 项目开源,有商业维护机构提供技术支持
成功案例 大疆无人机,其他中小型公司 百度,其他中小型公司 暂未找到
部署难度 可docker部署,docker内置各种库,并可直接使用。不使用docker时,需要进行编译和上层库依赖的编译,比较繁琐;文档齐全,部署比较简单。 无法进行docker部署,需要进行编译和上层库依赖的编译,比较繁琐;文档齐全,部署难度适中。 无法进行docker部署,无需编译,下载releases包解压即可用。

二. 环境准备

三个开源流媒体服务器,两流网络摄像头OBS推流(两个rtsp流,一个rtmp流),视频流信息如下:

网络摄像头

流地址:

枪机: rtsp://admin:sd123456@192.168.35.67:554/h265/ch33/main/av_stream

球机: rtsp://admin:sd123456@192.168.35.3:554/h265/ch33/main/av_stream

三. 功能满足度

经过初步调研,基本具体的功能满足度结果如下:

功能满足度 SRS ZLMedia EasyDarwin
OpenAPI 提供了SRS服务器状态查询和基本的配置文件修改(API概述 提供了ZLMedia服务器状态查询和音视频流操作的API(功能较全 API概述 在界面中存在API文档
接入视频网络设备方式 可通过FFmpeg推流去接摄像头(命令行方式),也可通过ingest方式接入(在配置文件中配置好数据流和输出流)。ingest接入方式比较理想但是存在无法增量添加设备的问题。 可通过FFmpeg推流去接摄像头(命令行方式),也可通过API接口调用的方式去接入(填入输入流和输出流)方式接入。HTTP接口接入设备功能便捷。 通过界面配置接入,接入设备便捷。但是只可以将RTSP转为RTSP流(只能通过IE浏览器配合插件使用),不符合业务需求,淘汰。
视频流稳定性 (1)通过命令行推流方式,比较稳定,但是要显式维持一个线程。
(2)通过ingest方式接入设备需要预先配置好设备。启动服务器后即可通过播放器拉流。
(1)通过命令行推流方式,比较稳定,但是要显式维持一个线程。
(2)httpAPI方式便捷,但是服务器本身对于该功能优化不到位,经常出现花屏的情况,非常影响观看体验。(经过检查发现转码时添加了很多多余的参数,推测将其删除之后应该就可以了)
视频很稳定(得益于协议没有转换)
浏览器支持 支持rtsp,rtmp,http-flv,hls,rtp,webrtc等格式拉流。考虑到flash的废弃,不能使用rtmp直接播放,所以使用了http server进行了hls分发,功能正常。 支持rtsp,rtmp,http-flv,hls,rtp等格式拉流。服务器已自动转换流为hls,rtmp,flv等格式,功能正常。 只可转换为rtsp流,需要配合插件在IE上播放。

四. 视频流展示

SRS:

摄像头数据流:

基本还原了网络摄像头的原画面效果

本地使用OBS推流:

功能正常

ZLMedia

摄像头数据流:

画面完全模糊,看不到东西

本地采用OBS推流:

功能正常

五. 针对具体功能的拓展:

  1. SRS 手动重写配置文件,并调用reload方法实现摄像头快速接入。

      采用nginxParser工具解析conf文件,并按照配置写入新的采集流,覆盖写入文件,并reload服务器。 结果: 新的摄像头可以实现无缝接入
    

六. 选型结果

综上所述,选用SRS作为视频网关的流媒体服务器。