在 Java 中使用 BUNDLE 进行 WebRTC 多路复用

Posted

技术标签:

【中文标题】在 Java 中使用 BUNDLE 进行 WebRTC 多路复用【英文标题】:WebRTC muxing using BUNDLE in Java 【发布时间】:2014-08-31 03:23:33 【问题描述】:

我正在寻找在基于 Java 的服务器上使用 BUNDLE 复用 RTP 和 RTCP 流的低级实现细节。使用 Chrome 作为我的源,本地 SDP 是这样的:

o=- 8554465656018336221 2 IN IP4 127.0.0.1 s=- t=0 0 a=group:BUNDLE 音频视频数据 a=msid 语义:WMS m=音频 1 RTP/SAVPF 111 103 104 0 8 126 c=IN IP4 0.0.0.0 a=rtcp:1 在 IP4 0.0.0.0 a=ice-ufrag:大众+winZTN4ejhvQJ a=ice-pwd:ufBTUw/iszvCbL53dmPHQAYK a=冰选项:谷歌冰 a=指纹:sha-256 5C:C6:19:38:4D:54:57:71:16:3F:67:A6:C8:21:CC:29:88:85:22:86:53:E5 :7B:3F:3D:A4:5C:E5:BC:29:D8:B5 a=设置:actpass a=中:音频 a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time a=recvonly a=rtcp 多路复用器 a=rtpmap:111 作品/48000/2 a=fmtp:111 minptime=10 a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:126 电话事件/8000 a=maxptime:60 m=视频 1 RTP/SAVPF 100 116 117 c=IN IP4 0.0.0.0 a=rtcp:1 在 IP4 0.0.0.0 a=ice-ufrag:大众+winZTN4ejhvQJ a=ice-pwd:ufBTUw/iszvCbL53dmPHQAYK a=冰选项:谷歌冰 a=指纹:sha-256 5C:C6:19:38:4D:54:57:71:16:3F:67:A6:C8:21:CC:29:88:85:22:86:53:E5 :7B:3F:3D:A4:5C:E5:BC:29:D8:B5 a=设置:actpass a=中:视频 a=extmap:2 urn:ietf:params:rtp-hdrext:toffset a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time a=recvonly a=rtcp 多路复用器 a=rtpmap:100 VP8/90000 a=rtcp-fb:100 立方厘米冷杉 a=rtcp-fb:100 nack a=rtcp-fb:100 nack pli a=rtcp-fb:100 goog-remb a=rtpmap:116 红色/90000 a=rtpmap:117 ulpfec/90000 m=应用程序 1 DTLS/SCTP 5000 c=IN IP4 0.0.0.0 a=ice-ufrag:大众+winZTN4ejhvQJ a=ice-pwd:ufBTUw/iszvCbL53dmPHQAYK a=冰选项:谷歌冰 a=指纹:sha-256 5C:C6:19:38:4D:54:57:71:16:3F:67:A6:C8:21:CC:29:88:85:22:86:53:E5 :7B:3F:3D:A4:5C:E5:BC:29:D8:B5 a=设置:actpass a=中:数据 a=sctpmap:5000 webrtc-datachannel 1024

我已经用谷歌搜索过等,但还没有找到我需要的东西。我确实找到了这个页面,它只包含高级信息,但我需要更多信息:https://datatracker.ietf.org/doc/html/draft-ejzak-avtcore-rtp-subsessions-01

此外,我订阅了https://groups.google.com/forum/#!aboutgroup/discuss-webrtc,但我还没有看到任何关于多路复用如何使用的低级信息

使用
a=group:BUNDLE 音频视频数据

相关问题: WebRTC java server trouble How can I mux/demux RTP media from one stream?

【问题讨论】:

【参考方案1】:

所有这些都意味着数据是通过同一个端口发送的。这并不意味着数据包本身被以任何方式修改。

分离数据包的方法(知道哪个是音频/视频及其各自的控制数据包)是在RTP/RTCP 数据包标头中检查它们各自的s-s-rC。这样您就不会在给定音频控制数据包的情况下修改您的视频流,反之亦然

在 chrome 中,您可以通过 SDP 交换向各个 s-s-rC id 发出警报,方法是为每个媒体级别添加 a=s-s-rc:<ID>(一个用于视频,一个用于音频)。

您的 SDP 似乎针对两种媒体类型都设置为 recvonly。这意味着它不会接收任何 RTCP,只会将它们发送回发送者,以便可以相应地修改流。

【讨论】:

所以捆绑时发送 RTP 数据包字节时没有任何附加信息或标头?最后,我没有看到 a:s-s-rc 行? 这些行不存在,因为这是recvonly...至少这是我假设的(我所做的所有工作都是sendrecv 并且存在s-s-rc 行)。发送 RTP 数据包字节,每个标头都包含其唯一的 s-s-rC ID,来自我在实践中看到的并自己解析这些。因此,当它们捆绑在一起时,它只是表示通过同一个端口,而不是数据包以某种方式合并。从技术上讲,不可能合并它们,因为它们会有不同的 ClockRates。 我会假设chrome不使用sendrecv,因为这是直播的情况。 是的,s-s-rC属性不存在的原因是因为它是recvonly。 IT 接收到的 SDP 应指示从服务器发送给它的 s-s-rC ID。 Google 不会知道 s-s-rC ID,除非提供它们,因为它不会生成媒体。

以上是关于在 Java 中使用 BUNDLE 进行 WebRTC 多路复用的主要内容,如果未能解决你的问题,请参考以下文章

Java Web应用集成OSGI

使用 bundle.js 时在浏览器中进行反应调试

如何在java中使用来自另一个bundle的OSGI引用

Android之使用Bundle进行IPC

Ubuntu下使用Android Studio4.0与 ndk-bundle 进行ndk开发总结

bundle文件压缩库的使用