WCS 5.2-用于Webcast和Webcam开发人员的WebRTC服务器的评论



Alice是一位经验丰富的全栈开发人员,能够在一周内使用php在她最喜欢的框架上编写SAAS项目框架。 至于前端,她更喜欢Vue.js。


客户通过电报与您联系,要求您开发一个网站,该网站将成为供雇主和员工进行面试的聚会场所。 面对面是指面对面的视频和语音实时实时视频联系。 “为什么不使用Skype?”有人可能会问。 碰巧的是,认真的项目(毫无疑问每个公司都认为自己是认真的项目)出于各种原因试图提供内部通信服务,其中包括:


1)他们不想将其用户借给第三方交流者(Skype,环聊等),并希望将其保留在服务中。


2)想要监视他们的通讯,例如通话记录和采访结果。


3)录音(自然地,将录音通知双方)。


4)他们不想依赖于第三方服务的政策和更新。 每个人都知道这个故事:Skype更新了,一切都烟消云散了……


这似乎是一个简单的任务。 在主题上进行搜索时出现WebRTC,似乎可以在两个浏览器之间组织对等连接,但是仍然存在一些问题:


1)从哪里获得STUN / TURN服务器?


2)如果没有他们,我们可以做吗?


3)如何记录对等WebRTC呼叫?


4)如果我们需要在通话中添加第三方,例如人力资源经理或雇主的另一位专家,将会发生什么?


事实证明,仅WebRTC和点对点是不够的,并且不清楚如何处理所有这些以启动服务所需的视频功能。


文章内容



服务器和API


为了缩小这些差距,使用了服务器解决方案和对等服务器对等体系结构。 Web Call Server 5.2(以下简称WCS)是服务器解决方案之一。 它是一个开发平台,允许您将此类视频功能添加到项目中,而不必担心STUN / TURN和对等连接的稳定性。


在最高级别,WCS是JavaScript API +服务器部分。 API用于在浏览器端使用常规JavaScript进行开发,并且服务器处理视频流量,充当媒体流量的状态代理。



除了JavaScript API,还有Android SDK和iOS SDK,分别需要为iOS和Android开发本机移动应用程序。


例如,将流发布到服务器(从网络摄像头流向服务器)看起来像这样:


Web SDK


session.createStream({name:”stream123”}).publish(); 

Android SDK


 publishStream = session.createStream(streamOptions) publishStream.publish(); 

iOS SDK


 FPWCSApi2Stream *stream = [session createStream:options error:&error]; if(![stream publish:&error]) { //published without errors } 

结果,我们不仅可以实现Web应用程序,还可以为具有视频流支持的Google Play和App Store完善功能。 如果我们将移动SDK添加到顶层图片,则会得到以下信息:




传入流


流服务器(即WCS)从传入流开始。 要分发某些东西,我们需要它。 要将视频流分发给查看者,这些流必须进入服务器,通过其RAM并通过网卡退出。 因此,在熟悉媒体服务器时,我们需要问的第一个问题是媒体服务器用来接受流的协议和格式。 对于WCS,这些是以下技术:WebRTC,RTMP,RTSP,VOD,SIP / RTP。



每个协议都可以由不同的客户端使用。 例如,不仅来自浏览器的流可以通过WebRTC进入,而且还可以从其他服务器进入。 在下表中,可能是传入流量的来源。


WebRTCRTMPRtsp伏特SIP / RTP
  • Web SDK
    • 相机+麦克风
    • 帆布
    • 屏幕共享

  • Android SDK
  • iOS SDK
  • WCS

  • 光盘

  • RTMP编码器
    • ffmpeg
    • Obs
    • 有线广播

  • Adobe编码器
  • WCS

  • Flash播放器

  • 网络摄像机
  • RTSP服务器

  • 文件系统
  • AWS S3

  • SIP端点
  • SIP会议



如果我们查看传入流量的来源,则可以添加以下内容:


传入的WebRTC


Web SDK不仅可以捕获相机和麦克风,还可以使用浏览器API的功能通过屏幕共享来访问屏幕。 此外,我们可以捕获任意的Canvas元素,并在其上进行后续广播的所有内容都是canvas流:


根据移动设备的具体情况,Android SDK和iOS SDK可以在旅途中在设备的前后摄像头之间切换。 这使我们可以在流式传输期间切换源,而不必暂停流式传输。


传入的WebRTC流也可以使用push,pull和CDN方法从另一个WCS服务器获得,这将在后面进行讨论。




传入rtmp


RTMP协议广泛用于流媒体最喜欢的OBS以及其他编码器中:Wirecast,Adobe Media Encoder,ffmpeg等。 使用这些编码器之一,我们可以捕获流并将其发送到服务器。


我们还可以使用push和pull方法从另一台媒体服务器或WCS服务器中提取RTMP流。 在推送的情况下,发起者是远程服务器。 在拉的情况下,我们转向本地服务器以从远程服务器拉流。




rtsp传入


RTSP通信的来源通常是IP摄像机或支持RTSP协议的第三方媒体服务器。 尽管启动RTSP连接时启动器是WCS,但从IP摄像机到该方向的音频和视频流量都向WCS服务器移动。 因此,我们认为来自摄像机的流是传入的。




来电视频


乍一看,VOD(视频点播)功能似乎与传出的流以及浏览器播放的文件专门相关。 但是在我们的情况下,这并不完全正确。 WCS将mp4文件从文件系统广播到本地主机; 结果,将创建传入流,就好像它是来自第三方源。 此外,如果我们将一个查看器限制为一个mp4文件,我们将获得经典的VOD,在此情况下,查看器将从一开始就获取流并进行播放。 如果我们不将一个查看器限制为一个mp4文件,则会获得VOD LIVE-VOD的一种变体,其中查看器可以与流一样播放同一文件,并连接到当前所有其他播放器所在的播放点(录制的电视广播模式)。




传入的SIP / RTP


要在SIP会话中接收传入的RTP流量,我们需要使用第三方SIP网关建立呼叫。 如果成功建立连接,则音频和/或视频流量将来自SIP网关,该网关将包装在WCS侧的传入流中。




外流


在将流接收到服务器后,我们可以根据请求将接收到的流复制到一个或多个查看器。 观众向播放器或其他设备请求流。 此类流称为传出流或“观看者流”,因为此类流的会话始终在观看者/播放器方面启动。 回放技术集包括以下协议/格式:WebRTC,RTMP,RTSP,MSE和HLS。



WebRTCRTMPRtsp微软ls
  • Web SDK
  • Android SDK
  • iOS SDK
  • 厕所
    • 光盘


  • Flash播放器
  • RTMP播放器

  • RTSP播放器
    • VLC
    • WCS


  • Web SDK

  • HLS播放器
    • hls.js
    • 野生动物园



即将发布的WebRTC


在这种情况下,Web SDK,Android SDK和iOS SDK充当播放器的API。 播放WebRTC流的示例如下所示:


Web SDK


 session.createStream({name:”stream123”}).play(); 

Android SDK


 playStream = session.createStream(streamOptions); playStream.play(); 

iOS SDK


 FPWCSApi2Stream *stream = [session createStream:options error:nil]; if(![stream play:&error]) { //published without errors } 

这与发布API非常相似,唯一的区别是调用stream.play()而不是stream.publish()。


第三方WCS服务器可以是播放器,将被指示使用Pull方法通过WebRTC从另一台服务器中拾取流或在CDN中拾取流。



即将离任的rtmp



这里主要是RTMP播放器-著名的Flash Player和使用RTMP协议的台式机和移动应用程序都可以接收和播放RTMP流。 尽管Flash离开了浏览器,但它保留了RTMP协议,该协议广泛用于视频广播,并且浏览器缺乏本机支持并不妨碍在其他客户端应用程序中使用这种相当成功的协议。 众所周知,RTMP在VR播放器中广泛用于Android和iOS上的移动应用程序。



即将发送的rtsp



WCS服务器可以充当RTSP服务器,并通过RTSP作为常规IP摄像机分发接收到的流。 在这种情况下,播放器必须与服务器建立RTSP连接,并选择要播放的流,就好像它是IP摄像机一样。



传出的MSE



在这种情况下,播放器使用Websocket协议从服务器请求流。 服务器通过Web套接字分发音频和视频数据。 由于开箱即用的本地MSE扩展,数据到达浏览器并转换为浏览器可以播放的块。 播放器最终将基于HTML5视频元素进行工作。



外发hls



在此,WCS充当支持HLS(HTTP实时流)的HLS服务器或Web服务器。 一旦传入的流出现在服务器上,就会生成一个.m3u8 HLS播放列表,该列表将响应HTTP请求而提供给播放器。 播放列表描述了播放器应下载和显示的视频片段。 播放器下载视频片段,然后在浏览器页面,移动设备,台式机,Apple TV机顶盒以及要求HLS支持的任何位置播放视频片段。



传入和传出


总共,我们有5种传入和传出流类型。 它们在表中列出:



收件箱外向
WebRTCWebRTC
RTMPRTMP
RtspRtsp
伏特微软
SIP / RTPls

也就是说,我们可以将流上传到服务器,进行连接,然后使用合适的播放器进行播放。 要播放WebRTC流,请使用Web SDK。 要将WebRTC流作为HLS播放,请使用HLS播放器等。 许多观众可以播放一个流。 一对多广播有效。


现在,让我们描述一下流可以执行的动作。



传入流操作


带有观众的流出流不容易被操纵。 实际上,如果查看者已经与服务器建立了会话,并且已经在获取某种流,则无法在不中断会话的情况下对其进行任何更改。 因此,所有操作和更改都在传入流上进行,此时复制尚未发生。 然后将经过更改的流分发给所有连接的查看器。


流选项包括:


-录音


-拍摄快照


-将流添加到混合器


-流转码


-添加水印


-添加FPS过滤器


-图像旋转90、180、270度



传入流录制



也许是最易懂和经常遇到的功能。 实际上,在许多情况下,流都需要记录:网络研讨会,英语课程,咨询等。

可以使用Web SDK或REST API发起记录,但有特殊要求:


 /stream/startRecording {} 

结果保存为mp4文件在文件系统中。



拍摄快照



同样常见的任务是对当前流进行拍照以在站点上显示图标。 例如,在一个视频监控系统中,我们有50个流,每个流都有一个IP摄像机作为源。 在一页上显示所有50个线程不仅对浏览器资源有问题,而且毫无意义。 在30 FPS的情况下,变化画面的总FPS将为1500,而人眼根本不会接受这种显示频率。 作为解决方案,我们可以按需配置自动切片或快照; 在这种情况下,可以在现场显示任意频率的图像,例如,每10秒显示1帧。 快照可以通过REST API从SDK中删除,也可以自动切片。



WCS服务器支持用于接收快照的REST方法:


 /stream/snapshot 




将流添加到混合器



可以将来自两个或多个源的图像合并为一个图像,以显示给最终查看者。 此过程称为混合。 基本示例:1)从一张屏幕上的多个摄像机进行视频监视。 2)电视会议,每个用户接收一个流,其余流混合在一起以节省资源。 混音器通过REST API进行控制,并具有用于创建视频会议的MCU操作模式。


REST命令将流添加到混合器:


 /mixer/startup 


流转码


transcoding_WebRTC_Android_iOS_SDK_API_WCS_browser_RTMP_RTSP_VOD_SIP_RTP


有时需要对流进行压缩,以通过分辨率和比特率适应某些客户端设备组。 为此,使用转码。 可以通过REST API在Web SDK端启用代码转换,也可以通过CDN中的特殊代码转换节点自动启用代码转换。 例如,可以将1280x720的视频转码为640x360,以从传统上带宽较低的地理区域分发给客户。 埃隆·马斯克(Elon Musk),您的卫星在哪里?



使用的REST方法:


 /transcoder/startup 


添加水印



众所周知,无论播放器有什么保护,任何内容都可以被盗并变成WebRip。 如果您的内容有价值,则可以在其中嵌入水印或徽标,这将大大增加其进一步使用和公开展示的难度。 要添加水印,只需上传一个PNG图像,它将通过转码将其插入视频流。 因此,如果您仍然决定在流中添加水印,则必须在服务器端准备几个CPU内核。 为了不通过转码在服务器上创建水印,最好将其直接添加到通常提供这种机会的编码器/流媒体器上。



添加FPS过滤器



在某些情况下,要求流具有均匀的FPS(每秒帧数)。 如果我们将流重新流式传输到第三方资源(如Youtube或Facebook)或与敏感的HLS播放器一起播放,这可能会派上用场。 过滤还需要转码,因此如果计划进行此类操作,请确保正确评估服务器的功能并为每个流准备2个内核。



图像旋转90、180、270度


rotation_WebRTC_Android_iOS_SDK_API_WCS_browser_RTMP_RTSP_VOD_SIP_RTP


移动设备具有根据旋转角度更改已发布流的分辨率的能力。 例如,您开始流式传输,水平握住iPhone,然后旋转它。 根据WebRTC规范,移动设备的流媒体浏览器(在这种情况下为iOS Safari)应向服务器发出旋转通知。 反过来,服务器必须将此事件发送给所有订阅者。 否则,将是这样-拖缆将手机放在一边,但仍然垂直看到相机,而观众则看到旋转的图像。 为了在SDK端进行旋转,包含了相应的cvoExtension扩展。



传入流的管理


自动-配置通常是在服务器端的设置中进行设置的。


流动作网络,iOS,Android SDKREST API自动的光盘
记录++

快照删除+++
添加到混音器++

流转码++
+
加水
标志


+
添加FPS过滤器

+
将图片旋转90度,
180、270度
+




流中继


中继也是操纵进入服务器的流的一种选择。 它包括强制将流传输到第三方服务器。 中继与重新发布,推送,插入等词同义。


可以使用以下协议之一实现中继:WebRTC,RTMP,SIP / RTP。 该表显示了可以中继流的方向。



WebRTCRTMPSIP / RTP
WCSRTMP服务器WCSSIP服务器


WebRTC中继



如果出于某种原因需要将流传递到另一台服务器上,则可以将流中继到另一台WCS服务器。 通过REST API通过/ push方法进行中继。 收到这样的REST请求后,WCS将连接到指定的服务器,并向该服务器发布服务器-服务器流。 之后,该流可用于在另一台机器上回放。


 /pull/push 

-使用的REST方法



RTMP中继



与WebRTC中继一样,也可以将RTMP中继到另一台服务器。 区别仅在于中继协议。 RTMP中继也通过/推送执行,并允许将流传输到第三方RTMP服务器和支持RTMP接收的服务:Youtube,Facebook流等。 因此,WebRTC流可以中继到RTMP。 我们最好将进入服务器的任何其他流(例如RTSP或VOD)中继到RTMP。


使用REST调用将视频流中继到另一个RTMP服务器。


 /push/startup 

-使用的REST呼叫



SIP / RTP中继



它是很少使用的功能。 通常,它用于企业中。 例如,当我们需要与外部SIP会议服务器建立SIP呼叫并将音频或视频流重定向到此呼叫,以便会议的观众看到某种视频内容时:“请观看此视频”或“同事” ,现在让我们观看来自施工现场的IP摄像机流”。 我们需要记住,在这种情况下,会议本身存在并在具有SIP支持的外部VKS服务器上进行管理(最近,我们已经测试了Polycom DMA的解决方案),而我们只是将现有流连接并中继到该服务器。 REST API函数称为/注入,仅用于这种情况。


REST API命令:


 /call/inject_stream/startup 


将服务器连接到CDN内容处理网络


通常,一台服务器的资源数量有限。 因此,对于观众数以万计的大型在线广播,必须进行扩展。 可以将多个WCS服务器组合到一个CDN内容传递网络中。 在内部,CDN将通过WebRTC来保持流式传输期间的低延迟。



可以以以下角色之一配置服务器:Origin,Edge或Transcoder。 源类型服务器接收流量并将其分发到边缘服务器,这些边缘服务器负责将流传递给查看器。 如果有必要以多种分辨率准备一个流,则在方案中包括代码转换器节点,该代码转换器承担代码转换流的资源消耗任务。



总结一下


WCS 5.2是用于开发具有对浏览器和移动设备的实时音频和视频支持的应用程序的服务器。 提供了四个用于开发的API:Web SDK,iOS SDK,Android SDK,REST API。 我们可以使用五种协议将视频流发布(馈送)到服务器:WebRTC,RTMP,RTSP,VOD,SIP / RTP。 在服务器上,我们可以使用五种协议与播放器一起播放流:WebRTC,RTMP,RTSP,MSE,HLS。 可以控制流,并进行诸如记录,切片快照,混合,代码转换,添加水印,过滤FPS以及在移动设备上播放视频广播之类的操作。 流可以通过WebRTC和RTMP协议中继到其他服务器,也可以重定向到SIP会议。 服务器可以组合到内容交付网络中,并可以扩展以处理任意数量的视频流。


爱丽丝必须了解与服务器一起使用的知识


开发人员需要能够使用Linux。 命令行中的以下命令不应引起混淆:


 tar -xvzf wcs5.2.tar.gz 

 cd wcs5.2 

 ./install.sh 

 tail -f flashphoner.log 

 ps aux | grep WebCallServer 

 top 

在进行Web开发时,还需要了解Vanilla JavaScript。


 //publishing the stream session.createStream({name:'mystream'}).publish(); //playing the stream session.createStream({name:'mystream'}).play(); 

使用后端的功能也可能派上用场。



WCS不仅可以通过REST API接收控制命令,而且还可以发送钩子-即有关发生的事件的通知。 例如,当尝试从浏览器或移动应用程序建立连接时,WCS将触发/ connect挂钩,而当尝试播放流时,它将触发playStream挂钩。 因此,开发人员将不得不稍作努力,后者可以创建一个简单的REST客户端和一个小型REST服务器来处理钩子。


REST API示例


 /rest-api/stream/find_all 

-用于在服务器上列出流的REST API示例


REST挂钩示例


 https://myback-end.com/hook/connect 

-后端的REST挂钩/连接处理。


Linux,JavaScript,REST客户端/服务器-三个元素足以在WCS平台上使用视频流开发生产服务。


开发移动应用程序将需要分别具有Java和Objective-C(适用于Android和iOS)的知识。


安装和启动


现在可以通过三种方式快速启动WCS:


1)安装Ubuntu 16.x LTS或Ubuntu 18.x LTS等 在您的Centos7上。 或以文档中文章为指导。



2) 在Amazon EC2上获取现成的图像



3) 在Digital Ocean上获取服务器现成的图像


并开始使用流视频功能进行激动人心的项目开发。


该评论文章原来很大。 感谢您耐心阅读。


拥有良好的流媒体!



友情链接


WCS 5.2 -WebRTC服务器


安装和启动


安装和启动WCS
在Amazon EC2上启动现成的映像
在DigitalOcean上启动服务器现成的映像


开发包


文档Web SDK
文档Android SDK
文档iOS SDK


案例


传入流
外流
流管理
流中继
CDN用于低延迟WebRTC流


文献资料


文档Web Call Server 5.2

Source: https://habr.com/ru/post/zh-CN482956/


All Articles