分享

将流服务从RTMP迁移到 WebRTC

 icecity1306 2018-07-15

image

有趣的客户

我坐在监视器前for一个小时,甚至是两个小时。 一切都开始了一些 Twitter,我的同事在Skype上kindly我。 然后,我偶尔打开了一些新闻网站,然后,Facebook,花了足够的时间来重新开始。

总之,我的背变得麻木了,我决定走一步,让它伸展。 summer fry fry fry fry fry fry Office silently silently silently 。 所以我就是limped最近的Coffee 机器。

在接待处的某个地方。 几分钟后我看见安娜跟一位高先生。 我在大约 fifty i 他的年龄。 他的头略微起皱,戴着灰色的短边帽。 他们were我。

有了 Coffee 机器,我已经经在我的杯子上加上了一个微软的英文- 喂,我打算用WebRTC项目。 我的NAME Schreder他给了我他的手。 我回答了握手,想什么可以带来这本德语,并邀请客人到我的Office 。

收集需求

H: 自 2000年以来,我们为大型用户群体在流和Flex中操作。 我们使用 Flash 媒体服务器( FMS ),并想对WebRTC进行 switch 。

我:你可以通过切换到WebRTC服务器来阐述你想要的目标?

我们需要一个接受来自用户的视频流并将它的传送给其他用户的常规媒体服务器。 我们要视频聊天。

我:没有问题,我们可以基于WebRTC服务器开发一个解决方案。

H: Adobe FMS适用于我们。 我们只是想将我们的用户群体扩展到 WebRTC,让成为。 它工作得很好。博士拿出了一个平板电脑,推送给了我,并指向下面的图:

image

H: Flex应用是医生,Flex应用是患者。 医生用网络摄像机同时查询几个病人。 一个病人可以以请求 private 咨询,医生为那个病人启动一个 private 约会,单一。 其他患者无法与医生进行沟通,也无法看到他。

image

那很奇怪,我想一个医生可以以为多个病人提供什么样的咨询。 一个有疼痛的耳朵,另一个bemoans扁桃体。 然后有tonsils点击按钮的private 咨询。 但是,原理很清楚。 让我们进入问题的技术方面。

我:你是指医生和病人之间的视频连接是双向的?

不准确。病人总是看到医生,但医生不能看到病人。 默认情况下,病人的视频已经关闭。

我:所以,它是一个方向- 从医生到病人?

在许多情况下,是的。 然而,有时患者想要向医生展示他们的视频。 这是个罕见的案例。

我知道,所以,你希望医生和病人使用WebRTC浏览器,如 Firefox 或者 Google Chrome,以及通过FMS工作的IE 。 这个正确吗?

几乎没有。我们所有的医生都使用一个由我们开发的Flex应用。 患者也应使用该应用或者 WebRTC 。

我:因此,理想情况下,应用程序应该如下所示? 我绘制了一个方案。

image

是的,它应该能像这样工作。 另一方面有一个本机的Flex应用程序,另一端有一个WebRTC浏览器。 我们主要对安卓智能手机和iOS设备感兴趣。 你知道,所有主流桌面浏览器都支持 Flash: IE,Chrome,Firefox,Safari,但是安卓和iOS缺少它。 我们希望你的服务也可以以用于移动用户,并保持在桌面计算机上工作的内容。

does: WebRTC在Android浏览器上工作很好,但是我们有一个问题,因为平台限制WebRTC不在那里工作。 我们将无法向iOS传送WebRTC视频流,也无法从iOS浏览器网络摄像机中传输视频。

等等,我知道,Safari不支持 WebRTC,但 Google Chrome 是不支持的。

我:是的,但不是在iOS下。 在这个平台 Chrome stumbles上,平台的技术限制,并且没有办法提供类似桌面计算机的WebRTC视频操作。 也就是说,iOS浏览器不是这里的选择。 我们不会把你自己的应用上传到苹果 App Store? 然后,iOS用户只需安装该应用程序,并使用纯WebRTC解决方案作为 Google Chrome?

很遗憾,由于特定原因,我们无法将应用程序提交到 App Store 。 这里外,我们希望给用户( 患者) 一种直接从浏览器通信的方法,不安装他们的iphone或者 ipad 。 我们有什么选择?

这时我想到那些"特定原因"阻止他们在 App Store 中发布应用程序。 实际上,医疗咨询是一个调节的球体,所以简单地上传这样的应用程序就不容易了,这可能不容易。

事实上,没有那么多的选择。 它们最好的变体是具有WebRTC支持的本地应用程序。 我们知道,支持他的( Apple HTTP直播流),但是由于假设医生和病人之间的实时对话,这个选项被拒绝。 而他的20秒时间延迟不适合实时通讯。

唯一的选择就是 websockets 。 web sockets几乎支持所有浏览器。 基本上,它是一个TCP通道,用于提供低延迟的视频,约 3秒。 这比 20秒好得多。 我们也希望将这个流播放到'视频'html5元素中,并且完成这个操作。

我:看来我们只有一个选择- web sockets 。 在这种情况下,病人将无法将他们的视频发送到服务器。 从医生到病人的单向传送是可能的。 我们也可以以试试它,但是只有 20秒的延迟,你几乎找不到这个选项适合。

in: 好的,我明白了,我们可以以直接从gprs浏览器中直接播放FMS的实时流。 WebRTC或者不是,但仍然具有低延迟,但与我们所获得的?

当然可以但是我们得先测试一下。 让我们指定周一,我将向你展示演示。

我想看看FMS如何与WebRTC和 web on集成,以确保这将在iOS和Android上工作。 这可能吗?

我:是的,我觉得。

H: 感谢你的咨询。 如果你不介意,我星期一来,我们会跟你一起讨论演示。

当然可以,现在一切都会被安排好。

正在寻找解决方案

从谈话中可以看出需求已经改变了。 现在,我们必须将交付方法插入到 Adobe AMS: Android的WebRTC和 iOS Safari的web 。 现在我们只需要缺少的链接,可以构建演示和合并所有涉及的协议和技术。

image

我bowed德国客人,开始查看Adobe规范。 除了"webrtc"和"webscoket"之外,还有许多有趣的东西。

然后,我决定简单地Google三个关键字: rtmp,webrtc,web sockets 。Google返回了一系列相关站点。 他们只有两种价值: 一个项目 Flashphoner,以及从 Phoboslab的开源Prototype的描述。

image

第一个候选者

我从Phoboslab开始,在这里找到了一个对that视频流播放问题的技术描述和一个似乎开源的解决方案。 这个解决方案基于 ffmpeg 。node.js 和一个客户端 javascript,用于解码和播放视频流。 所有的组件都是开源的,所以这个方案。 我在DO设置了虚拟服务器,构建ffmpeg并安装了 node.js 。 这只花了两小时的时间。

image

在 iOS Safari中播放的视频,并且效果良好。 我的iPhone5有点热,但是JavaScript稳定地处理来自 web socket的视频流量,并将它的显示在网页上。

事实上,JavaScript解码了流并在of浏览器的'画布'元素上绘制了它。

虽然以下问题仍然存在:

  • 如何从FMS中获取流
  • 如何向流中添加声音
  • 那WebRTC呢

这里有一点挫折。 后来,JavaScript播放器只播放了( 绘图) 视频。 对于音频,我们需要一个额外的流并以某种方式同步它们。 但解决方案不是为了。 因此,这个候选人没有满足需求。 由于缺少声音,它无法传送医生的视频。

第二候选项

另一个主题是称为支持 RTMP 。WebRTC 。Websocket协议的Web调用。 所以我只需要测试一下这是否适用于我的具体案例,并看看它是如何工作的。

首先,我决定测试一下xfs视频流如何转换为 web socket,就像我在第一个候选者之前做的一样。 如果我成功了,我们可以以简单地从FMS向Web调用服务器重定向voiceover流,然后解决任务。

image

拥有了 iPhone,我打开了一个演示页面,提供了从演示服务器测试操作的内容。 根据支持,Web调用服务器可以以快速安装在Linux系统上,但是仍需要时间。 demo接口是一个简单的Flash 应用程序,它使用简单接口和非常简单的函数实现 Flash 流。

image

从这个 Flash 应用程序可以通过RTMP协议连接到服务器并发布一个网络摄像头流。 发布意味着使用 Flash Player 从浏览器摄像头捕获视频流,并使用RTMP协议实时发送服务器上的数据。

根据连接和发布状态,连接成功,并将网络摄像机流正确发送到服务器。 为了避免在流中闪烁我自己的脸,我使用了一个虚拟相机和一个随机游戏。

现在,我们必须在Safari浏览器中看到并听到iPhone上的视频流。 为此,推荐一个单独的玩家,称为 WS 。

image

玩家设法在没有失真或者unsync的情况下显示好的图片和声音。 似乎我在这里取得了一些进步:

  • 我成功地测试了rtmp的web
  • 流具有声音和视频,并在Safari中正确显示

我必须测试WebRTC回放流和 switch的集成。 为了用WebRTC测试同一个流,我打开了另一个名为:的演示,并在 Chrome 中进行了 粘贴了流 NAME 并单击了播放。

image

我很高兴,卡丽熙 !

现在,我已经经在我的阿尔巴克的Chrome 中提供了流传递,这也意味着通过WebRTC传递到 Android 。 在这两种情况下,图片是平滑的,声音和一切,而且非常适合咨询服务。

下一步是处理 FMS 。 尽管RTMP应该与所有实现一致,但是我必须找到一个) retranslate是否接受这个流,如上面的测试所示。

Adobe媒体服务器集成

处理FMS的努力。 安装和测试花费了好几个小时。 首先我是用FML测试 FMS? 并确保正确安装和配置了,并且RTMP视频流在没有任何障碍的情况下运行。

image

下一步是配置RTMP流的重定向到 Flashphoner 。 在这里我得用我的头。 使用Adobe脚本脚本 docs finally 实现了以下脚本: main.asc

var wcsServer = "wcs5-eu.";var netConnections = new Object();var streams = new Object();
application.onConnect = function (client){
 trace("onConnect"+client.id);
 var nc = new NetConnection();
 var obj = new Object();
 obj.login = "Alice";
 obj.appKey = "flashChatApp";
 nc.connect("rtmp://"+wcsServer+":1935",obj);
 nc.onStatus = function(info){
 trace("onStatus info.code:"+info.code);
 if (info.code=="NetConnection.Connect.Success"){
 trace("connection opened"+wcsServer);
 }
 }
 netConnections[client.id]=nc;
 returntrue;
}
application.onDisconnect = function (client){
 trace("onDisconnect"+client.id);
 var nc = netConnections[client.id];
 if (nc){
 nc.close();
 trace("disconnected"+client.id);
 }
}
application.onPublish = function(client, myStream){
 trace("onPublish"+myStream.name);
 var nc = netConnections[client.id];
 ns = new NetStream(nc);
 ns.onStatus = function(info){
 if (info.code == "NetStream.Publish.Start"){
 trace("It is now publishing"+myStream.name);
 }
 }
 ns.attach(myStream);
 ns.publish(myStream.name);
 streams[myStream.name]=ns;
 trace("publish stream"+myStream.name+" to:"+wcsServer);
}
application.onUnpublish = function(client, myStream){
 trace("onUnpublish"+myStream.name);
 var ns = streams[myStream.name];
 if (ns){
 ns.publish(false);
 trace("unpublished"+ns.name);
 }
}

脚本很简单。它只将所有传入的FMS连接和视频流委派给Flashphoner服务器。 例如如果连接来自onConnect方法中的某个应用,则通过RTMP建立到Flashphoner的连接。 如果使用onPublish接收视频流,则在Flashphoner上发布相同的视频流。 在任何断开或者停止流上,相应的调用被委派给可用的资源。

因此我在Flashphoner和之间架起了桥梁,以传输流量,并进一步将它的转换为WebRTC和 web sockets 。

image

为了测试这个组合,我采取了 Flash 流接口,我在前面工作的Flash 。 现在惟一的区别是指定 main.asc 服务器的RTMP地址,并依赖于应该委托这个视频 streamto Flashphoner的脚本。 在我的例子中,地址是 rtmp://my-fms:1935.

image

,脚本编程的知识,我已经经历了九个hells调试,但是过去是过去的脚本,但是代码示例 above,代码示例是脚本的final 工作版本。 FMS做得很好,并按预期传递给收件人,这允许我在 Chrome 和Safari中成功播放它。

image

正在安装网络呼叫服务器

所以演示已经准备好了。 剩下的事情是在我自己的系统上安装网络呼叫服务器,以防止在演示过程中出现错误。 谁知道周一会发生什么? 开发者站点提供了 5个步骤的安装指导。 因为我不打算从照相机和麦克风中使用WebRTC流,所以我省略了安装SSL证书的第五步。

  • 下载网络呼叫服务器 5
  • 使用'install.sh'脚本安装
  • 使用'webcallserver启动'启动'
  • 打开 web http://host:9091 并激活你的许可证

安装成功。我在测试服务器上使用"服务iptables停止"初步禁用防火墙,以避免任何可能的流量锁定问题。 我将使用 admin http://host:9091 启动这个网页界面,激活测试许可证,并在我的Ubuntu上使用演示服务器,它看起来非常类似于这样:

image

测试的另一个迭代让我确信,这个系统在我的环境中也是完美的。 我在accomplishment完成工作后,在周一晚上在 Hans:的时候做了一次测试,让我在Hans的时候再试一次。 那是第一部分的全部。 如果有人感兴趣,我将描述迁移问题以及如何在第二部分中使用 finally 。

使用的工具:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多