2017-03-23 162 views
1

我目前正在测试Jitsi作为SFU。我正在尝试使用COLIBRI REST API创建一个简单的测试。当前的测试是一个JavaScript客户端,在两个选项卡中打开,每个选项卡通过REST API连接到Jitsi Videobridge(JVB),并通过JVB显示通过另一个客户端发送的视频。Jitsi Video Bridge COLIBRI REST API - 在webrtc-internals中没有ssrc_recv条目

首先,好消息。我已成功配置我们的客户端以通过REST API连接到JVB,并显示其他对等方的视频源。但是,chrome:// webrtc-internals只显示两个ssrc_send条目并且没有ssrc_recv条目。我很好奇为什么我们看到视频,并没有在webrtc-internals中看到任何ssrc_recv条目。

我们已经发现,通过向我们的SDP产品添加以下ssrc行,我们可以获得webrtc-internals以显示 src_recv条目。但是,统计数据显示,没有媒体流经这些ssrc_recvs ,我们丢失了我们是 的视频流,但没有看到ssrc行。

a=ssrc:${info.contents[0].channels[0].sources[0]} cname:mixed 
a=ssrc:${info.contents[0].channels[0].sources[0]} label:mixedlabelaudio0${sessionId} 
a=ssrc:${info.contents[0].channels[0].sources[0]} msid:mixedmslabel${sessionId} mixedlabelaudio0${sessionId} 

a=ssrc:${info.contents[0].channels[0].sources[0]} mslabel:mixedmslabel${sessionId} 

a=ssrc:${info.contents[1].channels[0].sources[0]} cname:mixed 
a=ssrc:${info.contents[1].channels[0].sources[0]} label:mixedlabelvideo0${sessionId} 
a=ssrc:${info.contents[1].channels[0].sources[0]} msid:mixedmslabel mixedlabelvideo0${sessionId} 
a=ssrc:${info.contents[1].channels[0].sources[0]} mslabel:mixedmslabel${sessionId} 

我们的主要问题是,为什么我们没有看到任何ssrc_recv条目 - 即使我们可以看到视频流流 - 以及我们如何 可以修改/修复我们的代码显示的WebRTC,内部那些ssrc_recv条目。我们担心没有看到这些条目 是一个更大的迹象,我们在实施中缺少一些东西。然而,是否有可能我们只是遇到Chrome bug的 ?

在这个问题上的任何帮助,不胜感激。

我已经包含以下相关的代码片段:

首次会议创建电话

POST {}到/ COLIBRI /会议

通道分配调用

PATCH下方到/ COLIBRI /会议/ 9ad7d1fe11a85c1a

{ 
    "id": "9ad7d1fe11a85c1a", 
    "contents": [ 
    { 
     "name": "audio", 
     "channels": [ 
     { 
      "expire": 60, 
      "initiator": true, 
      "endpoint": 1490294249498, 
      "direction": "sendrecv", 
      "channel-bundle-id": 1490294249498, 
      "rtp-level-relay-type": "mixer" 
     } 
     ] 
    }, 
    { 
     "name": "video", 
     "channels": [ 
     { 
      "expire": 60, 
      "initiator": true, 
      "endpoint": 1490294249498, 
      "direction": "sendrecv", 
      "channel-bundle-id": 1490294249498, 
      "last-n": 2 
     } 
     ] 
    } 
    ], 
    "channel-bundles": [ 
    { 
     "id": 1490294249498, 
     "transport": { 
     "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
     "rtcp-mux": true, 
     "fingerprint": { 
      "xmlns": "urn:xmpp:jingle:apps:dtls:0", 
      "required": false 
     } 
     } 
    } 
    ] 
} 

SDP提供

v=0 
o=- 1490294249719 2 IN IP4 0.0.0.0 
s=- 
t=0 0 
a=group:BUNDLE audio video 
m=audio 1 RTP/SAVPF 111 103 104 126 
c=IN IP4 0.0.0.0 
a=rtpmap:111 opus/48000/2 
a=rtpmap:103 ISAC/16000 
a=rtpmap:104 ISAC/32000 
a=rtpmap:126 telephone-event/8000 
a=fmtp:111 minptime=10; useinbandfec=1 
a=rtcp:1 IN IP4 0.0.0.0 
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=setup:actpass 
a=mid:audio 
a=sendrecv 
a=ice-ufrag:ere4l1bbu7bbf8 
a=ice-pwd:79r5i3snbhbrca0735vs3v30q4 
a=fingerprint:sha-1 C2:FF:06:CD:0D:6C:EF:6E:CC:54:CE:2D:F1:68:34:DB:06:B8:79:6A 
a=candidate:9ad7d1fe11a85c1a70d346f625a464501524626b 1 tcp 2130706431 172.31.54.51 4443 typ host generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a4645015247820 1 udp 2130706431 172.31.54.51 10000 typ host generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a46450ffffffff9d5ff4a9 1 tcp 1694498815 52.90.200.113 4443 typ srflx raddr 172.31.54.51 rport 4443 generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a46450ffffffff9d600a5e 1 udp 1677724415 52.90.200.113 10000 typ srflx raddr 172.31.54.51 rport 10000 generation 0 
a=rtcp-mux 
m=video 1 RTP/SAVPF 100 
c=IN IP4 0.0.0.0 
a=rtpmap:100 VP8/90000 
a=fmtp:100 x-google-start-bitrate=800 
a=rtcp:1 IN IP4 0.0.0.0 
a=rtcp-fb:100 ccm fir 
a=rtcp-fb:100 nack 
a=rtcp-fb:100 nack pli 
a=rtcp-fb:100 goog-remb 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=setup:actpass 
a=mid:video 
a=sendrecv 
a=ice-ufrag:ere4l1bbu7bbf8 
a=ice-pwd:79r5i3snbhbrca0735vs3v30q4 
a=fingerprint:sha-1 C2:FF:06:CD:0D:6C:EF:6E:CC:54:CE:2D:F1:68:34:DB:06:B8:79:6A 
a=candidate:9ad7d1fe11a85c1a70d346f625a464501524626b 1 tcp 2130706431 172.31.54.51 4443 typ host generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a4645015247820 1 udp 2130706431 172.31.54.51 10000 typ host generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a46450ffffffff9d5ff4a9 1 tcp 1694498815 52.90.200.113 4443 typ srflx raddr 172.31.54.51 rport 4443 generation 0 
a=candidate:9ad7d1fe11a85c1a70d346f625a46450ffffffff9d600a5e 1 udp 1677724415 52.90.200.113 10000 typ srflx raddr 172.31.54.51 rport 10000 generation 0 
a=rtcp-mux 

JSON/COLIBRI答案

PATCH以下/ COLIBRI /会议/ 9ad7d1fe11a85c1a

{ 
    "id": "9ad7d1fe11a85c1a", 
    "contents": [ 
    { 
     "name": "audio", 
     "channels": [ 
     { 
      "id": "b2c29ad1f4555d04", 
      "expire": 30, 
      "initiator": true, 
      "endpoint": "1490294249498", 
      "direction": "sendrecv", 
      "channel-bundle-id": "1490294249498", 
      "sources": [ 
      1274366703 
      ], 
      "ssrc-groups": [ 
      { 
       "semantics": "SIM", 
       "sources": [ 
       1274366703 
       ] 
      } 
      ], 
      "rtp-level-relay-type": "translator", 
      "payload-types": [ 
      { 
       "id": 111, 
       "name": "opus", 
       "clockrate": 48000, 
       "channels": 2, 
       "parameters": { 
       "fmtp": [ 
        "minptime=10;useinbandfec=1" 
       ] 
       } 
      }, 
      { 
       "id": 103, 
       "name": "ISAC", 
       "clockrate": 16000, 
       "channels": 1 
      }, 
      { 
       "id": 104, 
       "name": "ISAC", 
       "clockrate": 32000, 
       "channels": 1 
      }, 
      { 
       "id": 126, 
       "name": "telephone-event", 
       "clockrate": 8000, 
       "channels": 1 
      } 
      ], 
      "rtp-hdrexts": [ 
      { 
       "id": 1, 
       "uri": "urn:ietf:params:rtp-hdrext:ssrc-audio-level" 
      }, 
      { 
       "id": 3, 
       "uri": "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time" 
      } 
      ], 
      "transport": { 
      "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
      "rtcp-mux": true, 
      "pwd": "2u1eHOiv1Sc3dF4bEeVM0CP4", 
      "ufrag": "NJe9", 
      "fingerprints": [ 
       { 
       "fingerprint": "71:05:78:40:20:F0:F7:AD:DA:89:D6:F6:22:17:AC:FC:97:2B:1C:25:9A:D1:B6:E7:80:91:C7:72:A6:DE:2C:D3", 
       "hash": "sha-256", 
       "setup": "active" 
       } 
      ], 
      "candidates": [ 
       { 
       "foundation": 3031090232, 
       "component": 1, 
       "transport": "udp", 
       "priority": 2122260223, 
       "ip": "192.168.1.20", 
       "port": 53868, 
       "type": "host", 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 3031090232, 
       "network": 1, 
       "protocol": "udp" 
       }, 
       { 
       "foundation": 1119534572, 
       "component": 1, 
       "transport": "udp", 
       "priority": 1686052607, 
       "ip": "71.229.240.22", 
       "port": 53868, 
       "type": "srflx", 
       "raddr": "192.168.1.20", 
       "rport": 53868, 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 1119534572, 
       "network": 1, 
       "protocol": "udp" 
       }, 
       { 
       "foundation": 4197005512, 
       "component": 1, 
       "transport": "tcp", 
       "priority": 1518280447, 
       "ip": "192.168.1.20", 
       "port": 9, 
       "type": "host", 
       "tcptype": "active", 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 4197005512, 
       "network": 1, 
       "protocol": "tcp" 
       } 
      ] 
      } 
     } 
     ], 
     "sctpconnections": [] 
    }, 
    { 
     "name": "video", 
     "channels": [ 
     { 
      "id": "d4782a7f74565a42", 
      "expire": 30, 
      "initiator": true, 
      "endpoint": "1490294249498", 
      "direction": "sendrecv", 
      "channel-bundle-id": "1490294249498", 
      "sources": [ 
      1305961943 
      ], 
      "rtp-level-relay-type": "translator", 
      "ssrc-groups": [ 
      { 
       "semantics": "SIM", 
       "sources": [ 
       1305961943 
       ] 
      } 
      ], 
      "last-n": 2, 
      "payload-types": [ 
      { 
       "id": 100, 
       "name": "VP8", 
       "clockrate": 90000, 
       "channels": 2, 
       "parameters": { 
       "rtcp-fb": [ 
        "ccm fir", 
        "nack", 
        "nack pli", 
        "goog-remb" 
       ] 
       } 
      } 
      ], 
      "rtp-hdrexts": [ 
      { 
       "id": 3, 
       "uri": "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time" 
      } 
      ], 
      "transport": { 
      "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
      "rtcp-mux": true, 
      "pwd": "2u1eHOiv1Sc3dF4bEeVM0CP4", 
      "ufrag": "NJe9", 
      "fingerprints": [ 
       { 
       "fingerprint": "71:05:78:40:20:F0:F7:AD:DA:89:D6:F6:22:17:AC:FC:97:2B:1C:25:9A:D1:B6:E7:80:91:C7:72:A6:DE:2C:D3", 
       "hash": "sha-256", 
       "setup": "active" 
       } 
      ], 
      "candidates": [ 
       { 
       "foundation": 3031090232, 
       "component": 1, 
       "transport": "udp", 
       "priority": 2122260223, 
       "ip": "192.168.1.20", 
       "port": 53868, 
       "type": "host", 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 3031090232, 
       "network": 1, 
       "protocol": "udp" 
       }, 
       { 
       "foundation": 1119534572, 
       "component": 1, 
       "transport": "udp", 
       "priority": 1686052607, 
       "ip": "71.229.240.22", 
       "port": 53868, 
       "type": "srflx", 
       "raddr": "192.168.1.20", 
       "rport": 53868, 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 1119534572, 
       "network": 1, 
       "protocol": "udp" 
       }, 
       { 
       "foundation": 4197005512, 
       "component": 1, 
       "transport": "tcp", 
       "priority": 1518280447, 
       "ip": "192.168.1.20", 
       "port": 9, 
       "type": "host", 
       "tcptype": "active", 
       "generation": 0, 
       "network-id": 1, 
       "network-cost": 10, 
       "id": 4197005512, 
       "network": 1, 
       "protocol": "tcp" 
       } 
      ] 
      } 
     } 
     ], 
     "sctpconnections": [] 
    } 
    ], 
    "channel-bundles": [ 
    { 
     "id": "1490294224066", 
     "transport": { 
     "candidates": [ 
      { 
      "generation": 0, 
      "component": 1, 
      "protocol": "tcp", 
      "port": 4443, 
      "ip": "172.31.54.51", 
      "tcptype": "passive", 
      "foundation": "1", 
      "id": "9ad7d1fe11a85c1a5ec5e04d36669ed805534db8", 
      "priority": 2130706431, 
      "type": "host", 
      "network": 0 
      }, 
      { 
      "generation": 0, 
      "component": 1, 
      "protocol": "udp", 
      "port": 10000, 
      "ip": "172.31.54.51", 
      "foundation": "3", 
      "id": "9ad7d1fe11a85c1a5ec5e04d36669ed80553636d", 
      "priority": 2130706431, 
      "type": "host", 
      "network": 0 
      }, 
      { 
      "generation": 0, 
      "rel-port": 4443, 
      "ip": "52.90.200.113", 
      "foundation": "2", 
      "rel-addr": "172.31.54.51", 
      "priority": 1694498815, 
      "type": "srflx", 
      "network": 0, 
      "component": 1, 
      "protocol": "tcp", 
      "port": 4443, 
      "tcptype": "passive", 
      "id": "9ad7d1fe11a85c1a5ec5e04d36669ed80ffffffff8d8edff6" 
      }, 
      { 
      "generation": 0, 
      "rel-port": 10000, 
      "component": 1, 
      "protocol": "udp", 
      "port": 10000, 
      "ip": "52.90.200.113", 
      "foundation": "4", 
      "id": "9ad7d1fe11a85c1a5ec5e04d36669ed80ffffffff8d8ef5ab", 
      "rel-addr": "172.31.54.51", 
      "priority": 1677724415, 
      "type": "srflx", 
      "network": 0 
      } 
     ], 
     "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
     "ufrag": "8hvaa1bbu7airb", 
     "rtcp-mux": true, 
     "pwd": "187sh2bf3dl0lfola6goifb988", 
     "fingerprints": [ 
      { 
      "fingerprint": "C2:FF:06:CD:0D:6C:EF:6E:CC:54:CE:2D:F1:68:34:DB:06:B8:79:6A", 
      "setup": "actpass", 
      "hash": "sha-1" 
      } 
     ] 
     } 
    }, 
    { 
     "id": "1490294249498", 
     "transport": { 
     "candidates": [ 
      { 
      "generation": 0, 
      "component": 1, 
      "protocol": "tcp", 
      "port": 4443, 
      "ip": "172.31.54.51", 
      "tcptype": "passive", 
      "foundation": "1", 
      "id": "9ad7d1fe11a85c1a70d346f625a464501524626b", 
      "priority": 2130706431, 
      "type": "host", 
      "network": 0 
      }, 
      { 
      "generation": 0, 
      "component": 1, 
      "protocol": "udp", 
      "port": 10000, 
      "ip": "172.31.54.51", 
      "foundation": "3", 
      "id": "9ad7d1fe11a85c1a70d346f625a4645015247820", 
      "priority": 2130706431, 
      "type": "host", 
      "network": 0 
      }, 
      { 
      "generation": 0, 
      "rel-port": 4443, 
      "ip": "52.90.200.113", 
      "foundation": "2", 
      "rel-addr": "172.31.54.51", 
      "priority": 1694498815, 
      "type": "srflx", 
      "network": 0, 
      "component": 1, 
      "protocol": "tcp", 
      "port": 4443, 
      "tcptype": "passive", 
      "id": "9ad7d1fe11a85c1a70d346f625a46450ffffffff9d5ff4a9" 
      }, 
      { 
      "generation": 0, 
      "rel-port": 10000, 
      "component": 1, 
      "protocol": "udp", 
      "port": 10000, 
      "ip": "52.90.200.113", 
      "foundation": "4", 
      "id": "9ad7d1fe11a85c1a70d346f625a46450ffffffff9d600a5e", 
      "rel-addr": "172.31.54.51", 
      "priority": 1677724415, 
      "type": "srflx", 
      "network": 0 
      } 
     ], 
     "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
     "ufrag": "ere4l1bbu7bbf8", 
     "rtcp-mux": true, 
     "pwd": "79r5i3snbhbrca0735vs3v30q4", 
     "fingerprints": [ 
      { 
      "fingerprint": "C2:FF:06:CD:0D:6C:EF:6E:CC:54:CE:2D:F1:68:34:DB:06:B8:79:6A", 
      "setup": "actpass", 
      "hash": "sha-1" 
      } 
     ] 
     } 
    } 
    ], 
    "channel-bundlesFOO": [ 
    { 
     "id": 1490294249498, 
     "transport": { 
     "xmlns": "urn:xmpp:jingle:transports:ice-udp:1", 
     "rtcp-mux": true, 
     "pwd": "2u1eHOiv1Sc3dF4bEeVM0CP4", 
     "ufrag": "NJe9", 
     "fingerprints": [ 
      { 
      "fingerprint": "71:05:78:40:20:F0:F7:AD:DA:89:D6:F6:22:17:AC:FC:97:2B:1C:25:9A:D1:B6:E7:80:91:C7:72:A6:DE:2C:D3", 
      "hash": "sha-256", 
      "setup": "actpass" 
      } 
     ], 
     "candidates": [ 
      { 
      "foundation": 3031090232, 
      "component": 1, 
      "transport": "udp", 
      "priority": 2122260223, 
      "ip": "192.168.1.20", 
      "port": 53868, 
      "type": "host", 
      "generation": 0, 
      "network-id": 1, 
      "network-cost": 10, 
      "id": 3031090232, 
      "network": 1, 
      "protocol": "udp" 
      }, 
      { 
      "foundation": 1119534572, 
      "component": 1, 
      "transport": "udp", 
      "priority": 1686052607, 
      "ip": "71.229.240.22", 
      "port": 53868, 
      "type": "srflx", 
      "raddr": "192.168.1.20", 
      "rport": 53868, 
      "generation": 0, 
      "network-id": 1, 
      "network-cost": 10, 
      "id": 1119534572, 
      "network": 1, 
      "protocol": "udp" 
      }, 
      { 
      "foundation": 4197005512, 
      "component": 1, 
      "transport": "tcp", 
      "priority": 1518280447, 
      "ip": "192.168.1.20", 
      "port": 9, 
      "type": "host", 
      "tcptype": "active", 
      "generation": 0, 
      "network-id": 1, 
      "network-cost": 10, 
      "id": 4197005512, 
      "network": 1, 
      "protocol": "tcp" 
      } 
     ] 
     } 
    } 
    ] 
} 

铬的WebRTC内幕

Chrome WebRTC Internals

测试的浏览器标签

enter image description here

回答

1

你是不是能够看到ssrc_recv因为当我们从Jitsi videobridge要约,它带有一些默认的/无原因SSRC。在您提供的SDP中,您可以看到传入流没有ssrc。基本上,Jitsi发送另一个包含正确ssrc信息的消息(source-add)。所以,你需要做的setRemoteDescription与SSRC值让的WebRTC栈知道对应的接收流的实际SSRC,因此,它可以产生输入数据流的统计信息,并出现在的WebRTC内部也是如此。

+0

感谢您的答复! Jitsi如何发送源添加消息?我们目前正在使用REST API。有没有我能打的端点?它是通过数据通道发送的吗? –

+0

你是如何让你像传送信息(候选人),会话发起(提供)等其他叮当消息?理想情况下,您应该以相同的方式获得源代码添加,我指的是您在客户端和jitsi之间使用的任何信号机制。 –

+0

嗯,我们一直在使用REST API信令(https://github.com/jitsi/jitsi-videobridge/blob/master/doc/rest-videobridge.md) - 的API已经恢复交通信息等。当我们使我们的初始信道的要求,等等。我可以调用GET /会议/:会议ID和取回响应渠道和更新的频道的SSRC,但包括在响应没有交通工具的信息。 –

0

添加上有点@ Harish的回答是:如果你使用的桥梁休息API,我你不使用Jicofo和您使用的是自己的信令实体承担。如果是这样,那么你需要自己做所有的应用程序信号。大概你已经在做一些这个(把这个提议发给客户)。所以当第一个客户端加入时,它会从桥的信道分配响应中获得基础报价。一旦其他客户端加入,一些组件(可能是信令服务器)将需要积累它们的ssr并将它们添加到传出的提议中。