恩绍
我正在尝试通过网络将用户的网络摄像头流传输到基于C的服务器。我用过Janus网关。
我创建了一个小插件,该插件很大程度上基于echotest演示示例:我的浏览器通过WebRTC技术连接到我的janus服务器,并且流了用户的网络摄像头。
在服务器端,我有janus_incomming_rtp函数,该函数为我提供了char *缓冲区和int length。经过检查,传入的数据缓冲区大约是MTU的长度:我的视频的每一帧都是通过几个RTP数据包发送的。
我已经按照这个维基百科页面检查了一下标题,但是我不知道如何从UDP RTP数据包流中重建图像。理想情况下,我想将流传递给openCV进行实时图像处理。
我听说过gstreamer,但我不了解它是什么,也不会对它有什么帮助。此外,我不知道openCV是否具有任何内置功能来“重建”图像?而且我不知道视频帧是以哪种格式编码的:PT(有效负载类型)似乎是116,被定义为“动态”,但我不知道它是什么意思。
有什么帮助吗?
本杰明·特伦特(Benjamin Trent)
这是处理SRTP数据包以对其进行解码的一些指导步骤。
- 确保未复用rtp和RTCP,可以从SDP中删除该选项
- 将SRTP数据包解密为原始RTP,您将需要访问密钥交换(不确定是否已经这样做,但是所有媒体都已加密,并且使用DTLS交换了密钥,在处理之前必须将其解密)
- 抓取您的媒体有效负载类型并将其与SDP中的媒体进行匹配(您可以从SDP中的RTPMAP中看到什么媒体是什么有效负载)
- 从数据包中删除RTP有效负载(Gstreamer具有用于大多数常见有效负载(包括VP8)的RtpDepay插件)并对流进行解码。使用vp8的命令行管道的快速示例
- 现在,您可以显示原始的视频/音频数据包。
SDP:
- 如果要对RTCP和RTP进行多路复用,则将看到该行,
a=rtcp-mux
并且您将看到其中的端口a=rtcp:50111 IN IP4 <address>
和候选媒体端口将相同。
- 如果媒体本身正在多路传输,您将看到
a=group:BUNDLE audio video
SRTP:
- Janus已经处理了DTLS交换,并且看起来它可能已经在发送之前对rtp进行了解密,但是看起来它并不能解决rtp / rtcp和媒体的复用问题。
- 这是一个快速而肮脏的SRTP解密器,当您将其传递给DTLS中交换的MasterKey时,它可以工作。
GStreamer:
- 您可能需要研究GstAppSrc,它允许您将数组的字符放入gstreamer管道中进行解码,然后可以将其推到另一个udp端口,以使用OpenCV进行抓取。
- 这是我写的一个websocket服务器的示例代码,它将获取原始媒体并将其推送到管道中。这个例子并不完全是您想要做的(它不获取RTP,而是从网页获取原始媒体帧),但是它将向您展示如何使用AppSrc。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
编辑于
我来说两句