如何将网络摄像头视频流传输到服务器并对其进行操作

7
我希望能够从浏览器流式传输用户的网络摄像头到服务器,并且我需要服务器可以操作该流(在视频流上运行一些 C 算法)并将信息发送回用户。我已经深入研究了 WebRTC 和 MediaCapture,并阅读了这里的示例:https://bitbucket.org/webrtc/codelab/overview 但是这是用于点对点视频聊天的。据我所知,getUserMedia 中的 MediaStream 通过 RTCPeerConnection(使用 addStream)进行传输;我的问题是:我能否使用此方法,在服务器上处理视频流? 非常感谢您的帮助。

1
你不应该使用浏览器API,而应该使用native c/c++ WebRTC API,并且你可以从浏览器接收到一个呼叫,然后在你构建的本地API应用中进行操作。 - Benjamin Trent
1
好的,我会去检查代码,如果成功了,我会回到这里并为其他人发布答案。在此期间,如果有人来到这里并知道关于整个事情的任何信息,他将受到热烈欢迎!(特别是如果他能告诉我们是否需要实现信令 :-)) - nschoe
1
@nschoe 尽管我没有使用原生API,但信令仍然对于建立与服务器的实时通信连接至关重要。SDP(Session Description Protocol)描述了你是谁,你在哪里以及你将使用哪种媒体(和编解码器)(你指的是浏览器)。ICE候选项也很重要,以建立连接。我建议您了解有关设置WebRTC连接的内容。这个链接提供了有关信令的大量信息。在C中,系统应该工作得差不多相同。 - MarijnS95
2
事件处理程序会在连接稳定时触发,pc.onsignalingstatechange 会在信令正确完成时触发。pc.signalingState 包含当前状态。ICE 引擎也是如此:pc.oniceconnectionstatechangepc.iceGatheringStatepc.iceConnectionState。您可以在 w3 规范 中找到所有这些内容。 - MarijnS95
好的,感谢您提供这些信息。您发布的链接(此链接)非常有帮助。不过我仍然不明白,这种信令如何在服务器端进行?因为我希望我的服务器接收流而不是发送流:服务器在信令通道中向用户提供哪些信息? - nschoe
显示剩余8条评论
1个回答

12

这是我设计的解决方案。 我在这里发布给寻找同类信息的人们 :-)

前端

我使用WebRTC API:使用getUserMedia获取网络摄像头流,打开RTCPeerConnection(及RTCDataChannel用于下行信息)。 流是DTLS加密(强制要求),多媒体流使用RTP和RTCP。视频编码为VP8,音频编码为Opus。

后端

在后端,这是复杂的部分。 我能找到的最佳(至今)替代方案是Janus Gateway。它负责很多东西,如DTLS握手、RTP/RTCP分离等。基本上,每次传输RTP数据包时,它就会触发一个事件。(RTP数据包通常与MTU大小相同,因此视频帧与RTP数据包之间没有1:1的映射关系)。

然后我构建了一个GStreamer(版本1.0)来解包RTP数据包、解码VP8、确保视频缩放以及颜色空间/格式转换以发出BGR矩阵(与OpenCV兼容)。管道的开头有一个AppSrc组件,结尾有一个AppSink

剩下的工作

我必须采取额外措施来确保良好的可伸缩性(线程、内存泄漏等),并找到一种清洁和高效使用此程序中所包含的C++库的方法。

希望这能帮到你!


您能否提供一个您所做的例子给我?我对这个想法非常感兴趣,并且正在努力实现它。 - Dabbas
2
抱歉@Dabbas,我不在为这个解决方案开发的公司工作了,但如果你认真实施每个步骤,应该能够实现这一点。我发现很多人都在WebRTC上遇到困难,所以我开始在http://nschoe.com写一些非常详细的文章,稍后会谈到一些像这样的代码。目前有点不活跃,但我很快就会复兴它 :-) 最好的祝福。 - nschoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接