接收WebRTC音频和视频的最小SDP答案是什么?

时间:2014-12-20 21:28:35

标签: webrtc rtp sdp

我目前正在尝试将WebRTC MediaStreams流式传输到我的服务器,并在其中进行记录。遗憾的是,没有本机Java webRTC端点,所以我想自己实现这个特殊情况。

现在,鉴于提供sdp和我的服务器的公共IP,如何构建浏览器启动SRTP所需的DTLS握手所需的最小sdp响应?

如果你想解释一个具体的例子,请使用下面的sdp报价(源自带有单个视频mediaStream的chrome)并假设服务器的公共IP为" 12.34.56.78&#34 ; :

v=0
o=- 8782460735244849509 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE video
a=msid-semantic: WMS oHpG0QpIucmqjpjl26NElSfQfQD9Lnetl3Tn
m=video 59183 RTP/SAVPF 100 116 117 96
c=IN IP4 192.168.178.37
a=rtcp:59183 IN IP4 192.168.178.37
a=candidate:1833114227 1 udp 2122063615 192.168.178.37 59183 typ host generation 0
a=candidate:1833114227 2 udp 2122063615 192.168.178.37 59183 typ host generation 0
a=candidate:599844483 1 tcp 1518083839 192.168.178.37 0 typ host tcptype active generation 0
a=candidate:599844483 2 tcp 1518083839 192.168.178.37 0 typ host tcptype active generation 0
a=ice-ufrag:6iMBf9B5eBE6OQmW
a=ice-pwd:cc+Og0UJeyl5aUAYHNU2ixY0
a=ice-options:google-ice
a=fingerprint:sha-256 5C:1C:0B:92:6C:E7:87:D1:E0:83:26:2E:D9:90:B2:58:B0:76:D6:AF:D1:E9:38:91:C0:AF:1D:92:13:45:13:AC
a=setup:actpass
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtpmap:100 VP8/90000
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=rtpmap:116 red/90000
a=rtpmap:117 ulpfec/90000
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=100
a=ssrc-group:FID 2157921332 2260451967
a=ssrc:2157921332 cname:36oaVisUAzbVEQm5
a=ssrc:2157921332 msid:oHpG0QpIucmqjpjl26NElSfQfQD9Lnetl3Tn bdea0afa-598b-4829-9dfd-ceb9e8c6d23d
a=ssrc:2157921332 mslabel:oHpG0QpIucmqjpjl26NElSfQfQD9Lnetl3Tn
a=ssrc:2157921332 label:bdea0afa-598b-4829-9dfd-ceb9e8c6d23d
a=ssrc:2260451967 cname:36oaVisUAzbVEQm5
a=ssrc:2260451967 msid:oHpG0QpIucmqjpjl26NElSfQfQD9Lnetl3Tn bdea0afa-598b-4829-9dfd-ceb9e8c6d23d
a=ssrc:2260451967 mslabel:oHpG0QpIucmqjpjl26NElSfQfQD9Lnetl3Tn
a=ssrc:2260451967 label:bdea0afa-598b-4829-9dfd-ceb9e8c6d23d

3 个答案:

答案 0 :(得分:3)

您需要使用ip:port接听,您将收到媒体,并仅添加一名候选人。 在下面的示例中,让端口为22222。

您可以过滤要使用的编解码器。我选择了VP8。请注意,您需要更新m =视频行以仅包含正确的有效负载类型(如果是VP8,则为100)。

如果您不支持扩展程序,则还应删除它们(a = \ textmap ...)

如果您不支持捆绑,(并且您不需要仅用于视频通话),则需要删除= GROUP ...和a = mid ...属性。同样在这种情况下,您不需要生成ssrc标记,因此您也可以删除a = ssrc ...也。

您收到了setup:actpass,因此您需要回答设置:被动或设置:激活,具体取决于您是否要启动连接检查或让它们启动。

好的,到现在为止,你只是删除了非强制性内容。现在您需要将您添加到SDP中。您需要生成冰凭证并将其添加回来。

最后,您需要在服务器上拥有自己的证书(可以是自签名证书)并在SDP上共享指纹。

v=0
o=- 6548769878907123 4 IN IP4 127.0.0.1
s=-
t=0 0
m=video 22222 RTP/SAVPF 100
c=IN IP4 12.34.56.78
a=rtcp:22222 IN IP4 12.34.56.78
a=candidate:234234234 1 udp 768678678678 12.34.56.78 22222 typ host generation 0
a=ice-ufrag:yourgeneratedufrag
a=ice-pwd:yourgeneratedicepw
a=ice-options:google-ice
a=fingerprint:sha-256 YOUR_CERTIFICATE_FINGERPRINT_GOES_HERE
a=setup:passive
a=sendrecv
a=rtcp-mux
a=rtpmap:100 VP8/90000
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb

请注意,您需要在DTLS握手之前处理并生成ICE(经过身份验证的STUN请求)。

所以,这不是一项简单的任务......

答案 1 :(得分:1)

我认为这不会像你想象的那么容易。您必须建立ICE连接。似乎有几个库应该能够帮助你解决这个问题。你应该插入由这样一个库创建的ICE候选人。

对于SDP的转换,您可能需要查看我的WebRTC Echo服务器中的一些代码,它们执行类似的操作:https://github.com/Innovailable/webrtc-echo/blob/master/src/echo.coffee

答案 2 :(得分:1)

虽然您的示例具有相同IP的候选者,但更通用的情况是不同候选者来自ICE环境的不同部分。

2名申请知识产权的候选人 2名来自STUN服务器的候选人 来自TURN服务器的2名候选人

依次锁定到另一个是基于您的媒体服务器端提出的等效设置,然后发生ICE数据包握手。基本上,这些是在端点锁定到能够使用一个特定集合建立双向握手的路径之前尝试的特定路由。 Media / RTP应该仅在该特定路线中开始流动。

之前的答案是正常的SDP提议 - 答案案例,ICE不再涉及案件。