我正在尝试构建可以从双方流视频的移动应用程序(I。(比如视频通话)
我研究了一下webrtc,但它还没有为移动原生应用做好准备,无论如何,webrtc所做的是允许浏览器直接捕获相机和音频,而不需要插件等。但在原生移动应用中,捕捉摄像头和音频不是问题,基本上需要非常低的延迟和双传输层。在许多文章和地方,我读到关于在websockets上使用webbrtc。
所以我想我可以使用websockets流媒体视频。这是对的吗,还是我遗漏了什么?
我明白webtc是直接客户端到客户端的另一个区别…而websocket将是客户端-服务器-客户端,无论如何要避免它。这意味着什么呢?
你错过了什么
-
webRTC在移动设备上运行良好。在webrtc.org的参考代码(appRTCDEMO)中有示例/白色客户端,适用于iOS和android,以及多个应用程序。
-
从流中获取视频和音频流是
-
webRTC是真正的p2p连接(RTCPeerConnection:传输和防火墙遍历)和媒体引擎(编码,打包,加密)的方程式和你正在寻找的。
-
webSockets只是一个传输机制。它不处理防火墙/nat遍历、媒体处理和分组/分块,这些你必须在应用程序级别实现。
-
就信令而言,webRTC没有指定/强加任何协议,看起来通常的做法是建立一个信令服务器。应用程序通常使用web套接字或XHR或其他东西连接到该服务器,以完成原始的握手/呼叫设置。许多应用程序通过使用socket.io等库对其进行抽象。
注意:此解决方案可以并且确实适用于移动浏览器。但是,我不知道是否存在Android/IOS环境中所需的所有软件(即使是像React Native这样的软件)。
但是,解决方案是可行的。事实上,我已经在树莓派上做过了。
我基本上只是从USB摄像机直播一个FFMPEG管道,管道到UDP源,有一个"继电器";该服务基本上转换UDP数据包并使用引擎将其传输到客户端。然后在web端使用这个非常甜蜜的mpeg1编码器将web套接字数据包解码成mpeg1视频。
我对ffmpeg流进行管道操作,如下所示:https://github.com/freefarmdata/auto_farm_recorder/blob/master/recorder/src/controllers/streams.py#L13
然后读取UDP流并将其转发到Node应用程序,如:https://github.com/freefarmdata/auto_farm_recorder/blob/master/relay/src/socket.js L97
然后我使用如下代码解码流:https://github.com/freefarmdata/auto_farm_recorder/blob/master/web/src/app/widgets/LiveStream.js
请记住,这是使用TCP而不是UDP作为数据传输协议。这意味着,为了保持流,我必须确保我的客户端有足够的带宽进行直播。如果他们不这样做,我就不能在我的流上使用RTP或其他东西来做QOS来降低质量水平。我基本上只需要丢弃数据包,这反过来会丢弃帧,并在mpeg1解码器中导致奇怪的损坏问题。
理论上你可以用引擎做到这一点。IO服务和来回发送的数据包的连接质量将告诉"中继";服务器开始从一个不同的UDP源(一个是较低的比特率)。
我离题了。