公网视频流访问之webrtc-streamer

Posted 本然部落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了公网视频流访问之webrtc-streamer相关的知识,希望对你有一定的参考价值。

前言

之前两篇帖子

  • 视频流调试过程(海康威视+Kurento)
  • 使用Kurento提供公网视频流
    分别解决了从rstp视频流转码到页面播放和kurento的网络穿透的问题。但是吧,在我这次的具体方案中,它还是有个很讨厌的地方,就是需要https。而因为是政府项目,政府又因为很多麻烦的审核问题不想申请域名,这里就总是会出现一个看上去很吓人的安全警告。虽然无伤大雅,但是领导看见了总是会想一想的,说不定就给不少人找了很多麻烦。
    后来,我的同事发现了另一个项目webrtc-streamer 这个项目也是基于webtrc的。但是,和kurento不同的是,它就是针对从摄像头拉流的这个事情做的。从我们实际调试的效果上来说,确实比kurento要快一些。不过这是次要的,重要的是它不需要https。或许kurento也不需要,但是至少我现在不知道怎么操作。本文将会记录webtrc-streamer的安装调试过程,部分从前涉及的操作将会提到但不会再次详细记录,可以在上面两篇博客中查到。

安装配置

webrtc-stream的安装是使用docker的。
拉去镜像

sudo docker pull mpromonet/webrtc-streamer

启动镜像

sudo docker run -itd -p 8000:8000 --name webrtc-streamer mpromonet/webrtc-streamer

然后呢,你会发现这东西没法用。经过我同事的测试,这样操作仅仅是在使用本机docker的时候可用,一旦放到局域网中就不可用了。我们需要给它配置穿透服务。启动指令如下:

sudo docker run -itd -p 8000:8000 --name webrtc-streamer mpromonet/webrtc-streamer  -tkurento:kurento@穿透服务IP:3478  -s穿透服务IP:3478

后面加的两个参数就是对stun和turn服务的配置。stun和turn就是和我们在 使用Kurento提供公网视频流 中配置的穿透服务。但是配置文件中,设置的用户名密码是kurento:kurento

前端调用

与之前kurento不同,我们这里不需要一个websocket服务,是直接和webtrc-streamer服务进行通信的。上面我们docker配置的端口是8000。所以,我们可以直接通过js调用就可以将视频播放集成到我们的项目中。具体的我都写在了一个html页面中,源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/js/adapter.js"></script>
    <script src="/js/webrtcstreamer.js"></script>
</head>
<body>
<div id="play_div">

</div>
<script>
    var webRtcServerList = [];

    var urls=[
        '你的rtsp流地址'
    ];
    var rsurl='http://webtrc-streamer服务地址:8000/';

    function plays(idx)
        var videoelt = document.createElement("video");
        var vi_tag='videoTag_'+idx;
        videoelt.id = vi_tag;
        videoelt.muted = true;
        videoelt.width=500;
        videoelt.height=600;
        videoelt.controls=true;
        videoelt.title='videoTag_'+idx;
        document.getElementById ("play_div").appendChild(videoelt);
        var webRtcServer = new WebRtcStreamer(vi_tag,rsurl);
        webRtcServer.connectrstp(urls[idx]);
        webRtcServerList[idx]=webRtcServer;
    
    window.onload= function() 
       for(var i=0;i<urls.length;i++)
           plays(i);
       
    
    window.onbeforeunload = function() 
        for(var i=0;i<webRtcServerList.length;i++)
            webRtcServerList[i].disconnect();
        
    
</script>
</body>
</html>

代码中引用的两个js文件在下载文件的html和/html/lib文件夹下。
webtrc-streamer0.6.5
可以下载linux版本的,里面直接就能看到相关文件。

到此,公网web播放视频流的问题,暂时告一段落,希望不要让我再重启这个话题了。

后记

果然没有那么顺利,还是要重新开启这个话题。原因是我在产线服务器上安装turnserver启动后,日志提示客户端登录错误。于是打算用docker启动运行,排除环境因素。经过一系列的折腾后,最终使用docker的方式倒是很简单,先说成功的吧:

docker run -d --network=host --name=coturn -v /usr/local/etc:/usr/local/etc coturn/coturn -c /usr/local/etc/turnserver.conf

然后,说说这里的坑。

网络映射

在docker hub的说明中,网络映射分两种,端口映射和直接使用host映射。开始,我使用的端口映射。然后,直接影响了我连入产线环境的vpn访问。可能是由于做了大量udp端口映射导致这些端口被占用了吧,所以最后还是用了host映射。

配置

虽然使用docker,但是配置还是原来的配置不能变。这里有两个注意点

  • 文件夹映射:注意命令里的-v参数和值。这里将里外的目录映射成一样的,这样我就不用改配置文件了。
  • 指明启动参数:我添加的启动参数就是最后那段-c和之后的内容。就是指明使用哪个配置文件启动。倒不是说必须指明,而是原有的docker镜像中默认待的cmd中动态获取了external-ip并指定了进去。我的产线环境应该是有多个公网ip出口的,所以这里就可能发生错误。自己配置了参数后,原来带了的参数也就默认失效了,这个才是重点。

更换webtrc-streamer端口

是的,在我的产线中没有映射出去8000端口,所以启动的时候要将8000端口转为8443端口。经过我测试,不能直接用docker的端口映射,还是要改变配置文件中的监听端口。具体指令如下:

docker run -itd -p 8443:8443 --name webrtc-streamer mpromonet/webrtc-streamer -H0.0.0.0:8443  -穿透服务用户名密码@穿透服务IP:穿透服务端口  -s穿透服务IP:穿透服务端口

歇会儿,有问题再更新吧

没有公网IP怎样访问异地视频监控

前天下午下班前,小刘突然打电话问我有没有什么办法把几个个地方的视频监控汇聚到一起.小刘是和我一起长大的现在做安防监控的集成工作,我在一家公司做网络运维,涉及到网络问题他总会问我,且一般都是晚上问我,我当然也会很用心的回复他,今天快下班了打电话说明真的急了。
打完电话梳理了下,小刘接了一个小活,给一个商店连锁店安装了11个摄像头,其中总店4个,3个分店两个分店2个一个分店3个,每个店都有NVR存储,现在老板临时要加上功能在总店要能看到两个分店的监控。
这也没办法,要是放在做这个小活前,小刘说他肯定不接这活了。
气话总归气话,我给他理了理。
三个解决办法:
第一个拉点对点专线,这价位对小超市来说基本不可能,也能理解;
第二个总店拉固定IP的专线做V皮恩,需要重新采购几台V皮恩路由器,只是配置可能相对麻烦点,不过价位好多了;
在一个是找第三方软硬件解决,我推荐的是零遁的智能视频网关。
他问我这个和蒲公英路由器的区别,我说你知道蒲公英为什么还来问我,他说蒲公英的组网三个点还行,第四个点要持续收费啊,给老板建议了人家就不采纳。我说那这个零遁的还行,点位数没啥限制,好像带宽也不限制。
三天后他回电话说搞定了,我说你还厉害,都再没问我别的,他说那么简单操作他再不会说不过去了,哈哈。

以上是关于公网视频流访问之webrtc-streamer的主要内容,如果未能解决你的问题,请参考以下文章

没有公网IP怎样访问异地视频监控

公网传输技术之SRT协议解析(上)

ftp服务器Server-U突破局域网实现公网访问的方法

公网传输技术之SRT协议解析(下)

私有云 Windows IIS搭建webdav服务实现公网文件共享「内网穿透」

Python一行代码实现文件共享内网穿透公网访问