云服务上的SRS使用WebRTC进行推拉流
官方文档地址:https://ossrs.net/lts/zh-cn/
本教学使用自签证书,以CentOS7为例。文档推荐使用Ubuntu20,你也可以使用这个。
特别提醒:给RTC开放的端口一定要设置为UDP,一般我们设置安全规则都会习惯性的设置为TCP这个可能是导致你无法使用的一个问题
零、前置准备
1、一台CentOS7的云服务器
2、安装好git,安装好后输入git出现命令提示表示你已经装好了
yum list git # 列出git安装包 yum install git # 在线安装git
3、配置安全规则放行端口(注意这些端口是不是已经被你使用过了,比如我这里8080用了,不推荐改SRS端口):
注意:这里8000设置为UDP哦
# 使用前如果是一个新机没有使用过端口那不管,但是如果使用过,可以先查看对应端口的使用情况 netstat -tuln | grep 端口号 ## 如果存在输出,就需要你看看是改谁的端口方便了 ###################### 这里需要的端口:1935、8080、1985、8000(udp)、80、443 以下为参考配置: # WebRTC streaming config for SRS. # @see full.conf for detail config. listen 1935; max_connections 1000; daemon off; srs_log_tank console; http_server { enabled on; # 如果你想要切换这个端口需要注意,因为SRS一些前端源码中可能还是用的这个端口 要不你都去切换,要不使用nginx代理 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://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate candidate $CANDIDATE; } vhost __defaultVhost__ { rtc { enabled on; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc rtmp_to_rtc on; # 需要开启,不然rtmp的推流无法转换播放 # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp rtc_to_rtmp off; } http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } }
4、安装好对应的 FFmpeg
这里你有其他的安装方式也是可以的,主要是为了后面测试使用。主要这种方式需要的时间很久
# 添加含ffmpeg的仓库: # URL可能会随着时间的推移而更改,所以请确保检查Nux Dextop的官方文档或网站以获取最新的URL sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm # 安装FFmpeg和FFmpeg开发包: sudo yum install ffmpeg ffmpeg-devel # ffmpeg -version ffmpeg -version # 需要添加额外功能到ffmpeg的自己去找教学,比如向nginx中加nginx-http-flv-module模块也可以搭建一个流媒体服务器
5、构建GO语言运行环境
1、删除旧版本(没装过就不管,有就别装^-^)
sudo rm -rf /usr/local/go sudo apt-get remove golang sudo apt-get remove golang-go sudo apt-get autoremove
2、下载最新版本
#wget 后面的下载链接请去golang官网(https://golang.google.cn/dl/)获取你想下载的对应go版本 sudo wget https://golang.google.cn/dl/go1.20.3.linux-amd64.tar.gz # 解压文件 sudo tar xfz go1.20.3.linux-amd64.tar.gz -C /usr/local
3、设置环境变量
#1、打开profile: sudo vim /etc/profile # 2、在末尾行添加以下变量: export GOROOT=/usr/local/go export GOPATH=$HOME/gowork export GOBIN=$GOPATH/bin export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH # i 插入 esc :wq 保存退出后可以使用 cat /etc/profile 查看是否添加成功 # 3、是环境立即生效 source /etc/profile # 4、将环境立即生效载入脚本 # 先打开文件这个文件: cd ~ sudo vim .bashrc # 末行加入这个命令: source /etc/profile
4、查看go语言环境变量
go env
5、GO111MOUDLE和更改GOPROXY
go env -w GOPROXY="https://goproxy.cn" go env -w GO111MODULE=on
6、查看go语言版本,输出版本后安装成功
go version
一、安装和编译SRS并测试使用
1、拉取SRS源码,github地址:https://github.com/ossrs/srs
# 在你觉得合适的地方可以创建一个目录 mkdir srs # 拉取对应的源码 git clone -b https://github.com/ossrs/srs.git # 查看我们所处的分支 git branch -a # 切换分支到4.0 可以再次查看验证 git checkout 4.0release
2、编译安装
# 到 trunk 目录下:一般在srs/trunk ./configure # 过程可能有点久 # 输出以下结果表示编译成功 You can build SRS: " make " to build the SRS server " make help " to get some help # 运行make构建 make
3、运行
1、运行:
# 使用rtc.conf在 trunk目录 下运行 ./objs/srs -c conf/rtc.conf # 访问地址 http://你的服务器ip地址:8080 # 不推荐改配置文件的端口,除非你可以使用nginx代理或者对SRS熟悉
看到如下显示就成功了:
2、为了验证是否可用:
提示:在trunk目录下运行,友情提示要学会根据指令判断运行位置,比如这里./doc说明运行处有这个文件,而在trunk下就有,学会大胆假设:
# 使用ffmpeg进行推流 ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream
进入对应的SRS播放器中,在SRS播放中点击播放视频,可以成功显示表示你前面的配置是ok的
4、提示:如果使用RTC播发器会黑屏加载中 或者 闪退
# 在谷歌浏览器中输入这个地址(这个的使用需要去了解学习): chrome://webrtc-internals # conf/rtc.conf的配置文件中: rtmp_to_rtc on; # 需要开启,不然rtmp的推流无法转换播放
通过这个可以看到得到服务器返回的IP地址存在问题,和实际的地址不符。处理方案:
# conf/rtc.conf的配置文件中: rtc_server { enabled on; listen 8000; # UDP port # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate candidate 改为你的服务器ip; }
最后当你使用RTC的播放器可以播放时,第一阶段就好了。
二、使用自签证书配置HTTPS
参考地址:https://github.com/ossrs/httpx-static?tab=readme-ov-file
为什么需要,因为WebRTC的推拉流为了保证安全是需要https的或者你再本机安装使用是如果地址是localhost可以不用https。
1、下载工具
# 我会在我创建的srs的同级目录下创建一个 httpx-static 再进克隆 git clone https://github.com/ossrs/httpx-static.git
2、生成证书
在对应参考地址下点击对应的httpx-static可以复制下面指令:
# 在 httpx-static 根目录下 的 httpx-static目录下执行 openssl genrsa -out server.key 2048 && subj="/C=CN/ST=Beijing/L=Beijing/O=Me/OU=Me/CN=me.org" && openssl req -new -x509 -key server.key -out server.crt -days 365 -subj $subj
1、步骤一:
2、步骤二:
3、可以看到:
3、使用GO构建项目
# 在 httpx-static 根目录下 的 httpx-static目录下执行 go build -mod=vendor .
可以生成:
注意:这里有两个证书的地址,取决于你在那里生成的证书,我这里证书在可执行脚本 httpx-static 的同级
1、这里你可以看到一些指令执行的帮助信息和参数解释
# 此时 httpx-static 可执行文件生成 ./httpx-static
2、测试指令,运行成功后直接浏览器访问你的ip地址就可以看到
由于是自签证书,所以需要点击高级,继续访问。如果你有自己的域名和对应的SSL证书那你可以去根据自己的配置,此处以没有为例
# 80 ---> 443 这里是通过访问自带的页面查看代理是否成功 ./httpx-static -t 80 -s 443 -k server.key -c server.crt -r ./html # 访问测试: ip https://ip
3、初步代理,发现无法进行推流:
提示:这里的参数 -r 后面跟的是你自己的srs的安装路径,-p参数 这里都是这样 把你自己ip对应的这些请求代理
# 代理 SRS 页面:https://你的IP/ 访问地址,这里的ip是安装SRS服务器的IP ./httpx-static -t 80 -s 443 -k server.key -c server.crt -r /usr/local/srs/srs/trunk/research
4、最终版本(注意替换你自己的ip地址):
提示:这里的参数 -r 后面跟的是你自己的srs的安装路径,-p参数 这里都是这样 把你自己ip对应的这些请求代理
# 发现还是无法推流,是需要把推流地址也进行代理 ./httpx-static -t 80 -s 443 -k server.key -c server.crt -r /usr/local/srs/srs/trunk/research/ -p http://你的IP:1985/rtc/
三、最终效果
1、使用rtc.conf启动SRS
# 我的执行地址:/usr/local/srs/srs/trunk ./objs/srs -c conf/rtc.conf
2、开启代理
# 我的执行地址:/usr/local/srs/httpx-static/httpx-static/httpx-static ./httpx-static -t 80 -s 443 -k server.key -c server.crt -r /usr/local/srs/srs/trunk/research/ -p http://你的IP:1985/rtc/
3、访问地址
提示:这里的使用一个推流,可以多个播放,但是并不是双向的,但是WenRTC是可以实现一对一视频通话的。
# 开两个窗口一个用于推流,一个用于播放。你也可以给另外的人打开或者使用手机打开地址 https://你的ip/players/srs_player.html
这是最终的一个测试效果:
四、总结
B站参考视频:
原作者视频,我只是抽出了里面的部分,这里就有关于webrtc的配置和一些问题(感谢作者)
关于WebRTC一对一视频通话参考视频(感谢作者) https://www.bilibili.com/video/BV1D14y1W7qp/?spm_id_from=333.337.search-card.all.click&vd_source=3482c0c40f6a05b99c21075cb9535764
参考文档:
SRS官方文档:
WebRTC中文文档:
展望
我们可以使用WebRTC实现简单的一对一视频通话,这个可以用于一些IM即时通讯系统中,在聊天的基础上进行一对一视频通话。
这里我们使用的是官方提供的页面进行推拉流,如果我们可以自己写一个页面来进行推拉流,并结合进项目^-^。而且可以推本机屏幕的流实现一个屏幕共享的简易直播,这里就需要去研究一SRS所提供的接口了,还要去研究一下SRS的部分源码,推荐拉下源码使用CLion打开,参考前端页面路径:srs\trunk\research\players
测试成功的小伙伴可以感受的这个的延迟比起RTMP和HLS和HTTP-FLV的延迟效果要好很多,然后就是对于播放器来说,RTMP的播放器+_+,相比起来HLS和HTTP-FLV都支持http协议,所以播放器还是好点的。就是HLS延迟感人,适用于点播。而HTTP-FLV推荐使用B站开源播放器flv.jd:https://github.com/bilibili/flv.js 而这个flv是可以较快搭建一个简易的Web直播的延迟大概在4-5秒左右。比如:使用nginx的 nginx-http-flv-module 模块配置一个流媒体服务器,再使用ffmpeg本机摄像头推流,然后前端使用flv.js进行播放。当然你也可以使用SRS的flv的播放地址。更多请参考文档和找好文章和教学。
最后,到这里结束了吗?不不不,结合前面我说过的YOLOv5,那么可以碰撞什么火花呢?YOLO 启动!
提示:WebRTC的流貌似不能直接获取,但是SRS其实也提供了一些rtc和rtmp的转化,这里我只能以默认的ffmpeg推流展示一下:
# 启动 ./objs/srs -c conf/rtc.conf # 推流 ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream # YOLO运行 python detect.py --weights yolov5s.pt --source http://你的IP:8080/live/livestream.flv
本文作者:编程初学者求大佬指点
本文链接:https://www.cnblogs.com/fragmentary/p/18272851
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步