草庐IT

公网视频流访问之webrtc-streamer

本然部落 2023-07-10 原文

前言

之前两篇帖子

  • 视频流调试过程(海康威视+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:穿透服务端口

歇会儿,有问题再更新吧

有关公网视频流访问之webrtc-streamer的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  7. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  8. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

  9. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  10. ruby - 使用 Class.new 时访问外部范围 - 2

    是否有可能以某种方式访问​​Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(

随机推荐