从 RTP 数据包重建图像

nsc*_*hoe 3 opencv udp webrtc janus-gateway

我正在尝试通过网络将用户的网络摄像头流式传输到基于 C 的服务器。我用过Janus网关

我创建了一个小插件,它很大程度上基于 echotest 演示示例:我的浏览器通过 WebRTC 技术连接到我的 janus 服务器,并且它可以流式传输用户的网络摄像头。

在服务器端,我有janus_incomming_rtp函数,它给我一个char * bufferint length。经过检查,传入数据的缓冲区大约是 MTU 的长度:我的视频的每一帧都是通过多个 RTP 数据包发送的。

我已经按照此维基百科页面检查了一些标头,但我不知道如何从 UDP RTP 数据包流中重建图像。理想情况下,我想将流传递给 openCV 进行实时图像处理。

我听说过 gstreamer,但我不明白它是什么,也不明白它如何帮助我;另外我不知道openCV是否有任何内置函数来“重建”图像?而且我不知道视频帧以哪种格式进行编码:PT(有效负载类型)似乎是 116,它被定义为“动态”,但我不知道它意味着什么。

有什么帮助吗?

Ben*_*ent 5

以下是处理 SRTP 数据包以对其进行解码的一些指导步骤。

  1. 确保 rtp 和 RTCP 没有复用,您可以从 SDP 中删除该选项
  2. 将 SRTP 数据包解密为原始 RTP,您将需要访问密钥交换(不确定您是否已经执行此操作,但所有媒体均已加密并且使用 DTLS 交换密钥,并且在处理之前必须解密)
  3. 获取您的媒体负载类型并将其与 SDP 中的媒体进行匹配(您可以从 SDP 中的 RTPMAP 中看到什么媒体是什么负载)
  4. 从数据包中删除 RTP 有效负载(Gstreamer 具有适用于大多数常见有效负载的 RtpDepay 插件,包括 VP8)并解码流。使用 vp8 的命令行管道的快速示例
  5. 现在您有了可以显示的原始视频/音频数据包。

社会发展计划:

  • 如果 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。