WebRTC RTP 流到 public IP 没有 ICE/STUN
WebRTC RTP stream to public IP without ICE/STUN
我有一个 public IP,我希望我的客户将他们的 WebRTC RTP 流发送到该 IP。
客户端将知道编解码器以及将流发送到哪些端口。
我正在尝试尽可能地实现一个准系统,但似乎缺少太多细节。
所有 Google 搜索指向为此使用某种服务器,例如 Janus 网关,如果需要,这是可以接受的,但我不明白为什么我需要这个,这是唯一的要求对我来说是让浏览器将 RTP 流发送到预定义的 IP 和端口。
我已经使用 Janus 网关创建了一个工作设置,然后复制了使用的 SDP,这样我就可以在没有 Janus 的设置中使用它们。
navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(function (stream) {
let videoElement = document.getElementById("my-video");
videoElement.srcObject = stream;
var peerConnection = new RTCPeerConnection({iceServers: []});
peerConnection.onnegotiationneeded = function() {
console.log("onnegotiationneeded");
peerConnection.createOffer({offerToReceiveAudio: false, offerToReceiveVideo: false}).then(function (offer) {
peerConnection.setLocalDescription(offer);
console.log("setRemoteDescription");
peerConnection.setRemoteDescription({
type: 'answer',
sdp: `v=0
o=mozilla...THIS_IS_SDPARTA-74.0.1 1586270943313087 1 IN IP4 192.168.1.5
s=VideoRoom 1234
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS janus
m=audio 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 192.168.1.5
a=recvonly
a=mid:0
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:109 opus/48000/2
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=msid:janus janusa0
a=ssrc:849691919 cname:janus
a=ssrc:849691919 msid:janus janusa0
a=ssrc:849691919 mslabel:janus
a=ssrc:849691919 label:janusa0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 126
c=IN IP4 192.168.1.5
a=recvonly
a=mid:1
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:126 H264/90000
a=fmtp:126 profile-level-id=42e01f;packetization-mode=1
a=rtcp-fb:126 ccm fir
a=rtcp-fb:126 nack
a=rtcp-fb:126 nack pli
a=rtcp-fb:126 goog-remb
a=rtcp-fb:126 transport-cc
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:6/inactive http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=msid:janus janusv0
a=ssrc:3452602418 cname:janus
a=ssrc:3452602418 msid:janus janusv0
a=ssrc:3452602418 mslabel:janus
a=ssrc:3452602418 label:janusv0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates`
})
});
};
let tracks = stream.getTracks();
for(var i = 0; i < tracks.length; i++) {
peerConnection.addTrack(tracks[i]);
}
});
在这里我初始化网络摄像头源,创建一个没有 ICE 服务器的 RTCPeerConnection 作为 并添加所有曲目。
我设置了一个 onnegotiationneeded 回调的侦听器,当需要协商时,我创建了一个报价,其中在 RTCPeerConnection 上将 offerToReceiveAudio 和 offerToReceiveVideo 设置为 false,在创建之后,我将创建的报价设置为 RTCPeerConnections 本地描述。
在此之后,我将预定义的 SDP 设置为 remoteDescription。
SDP 是从 Janus session 复制过来的,它包含 ICE 属性,如 ice-ufrag、ice-pwd 和 ice-options,如果我删除它们,我会得到关于 Invalid description 的错误。
SDP 还包含 STUN(?) 候选者,删除它们没有任何区别。
在 运行 之后,浏览器连接到 STUN 候选者,但由于服务器是 运行 在 public IP 上,因此这不是必需的,请求失败..
应该采取哪些步骤来进行最小设置,其中浏览器将 RTP 发送到预定义编解码器上的预定义 host/port?
我有一个 public IP,我希望我的客户将他们的 WebRTC RTP 流发送到该 IP。
客户端将知道编解码器以及将流发送到哪些端口。
我正在尝试尽可能地实现一个准系统,但似乎缺少太多细节。
所有 Google 搜索指向为此使用某种服务器,例如 Janus 网关,如果需要,这是可以接受的,但我不明白为什么我需要这个,这是唯一的要求对我来说是让浏览器将 RTP 流发送到预定义的 IP 和端口。
我已经使用 Janus 网关创建了一个工作设置,然后复制了使用的 SDP,这样我就可以在没有 Janus 的设置中使用它们。
navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(function (stream) {
let videoElement = document.getElementById("my-video");
videoElement.srcObject = stream;
var peerConnection = new RTCPeerConnection({iceServers: []});
peerConnection.onnegotiationneeded = function() {
console.log("onnegotiationneeded");
peerConnection.createOffer({offerToReceiveAudio: false, offerToReceiveVideo: false}).then(function (offer) {
peerConnection.setLocalDescription(offer);
console.log("setRemoteDescription");
peerConnection.setRemoteDescription({
type: 'answer',
sdp: `v=0
o=mozilla...THIS_IS_SDPARTA-74.0.1 1586270943313087 1 IN IP4 192.168.1.5
s=VideoRoom 1234
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS janus
m=audio 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 192.168.1.5
a=recvonly
a=mid:0
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:109 opus/48000/2
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=msid:janus janusa0
a=ssrc:849691919 cname:janus
a=ssrc:849691919 msid:janus janusa0
a=ssrc:849691919 mslabel:janus
a=ssrc:849691919 label:janusa0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 126
c=IN IP4 192.168.1.5
a=recvonly
a=mid:1
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:126 H264/90000
a=fmtp:126 profile-level-id=42e01f;packetization-mode=1
a=rtcp-fb:126 ccm fir
a=rtcp-fb:126 nack
a=rtcp-fb:126 nack pli
a=rtcp-fb:126 goog-remb
a=rtcp-fb:126 transport-cc
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:6/inactive http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=msid:janus janusv0
a=ssrc:3452602418 cname:janus
a=ssrc:3452602418 msid:janus janusv0
a=ssrc:3452602418 mslabel:janus
a=ssrc:3452602418 label:janusv0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates`
})
});
};
let tracks = stream.getTracks();
for(var i = 0; i < tracks.length; i++) {
peerConnection.addTrack(tracks[i]);
}
});
在这里我初始化网络摄像头源,创建一个没有 ICE 服务器的 RTCPeerConnection 作为
我设置了一个 onnegotiationneeded 回调的侦听器,当需要协商时,我创建了一个报价,其中在 RTCPeerConnection 上将 offerToReceiveAudio 和 offerToReceiveVideo 设置为 false,在创建之后,我将创建的报价设置为 RTCPeerConnections 本地描述。
在此之后,我将预定义的 SDP 设置为 remoteDescription。
SDP 是从 Janus session 复制过来的,它包含 ICE 属性,如 ice-ufrag、ice-pwd 和 ice-options,如果我删除它们,我会得到关于 Invalid description 的错误。
SDP 还包含 STUN(?) 候选者,删除它们没有任何区别。
在 运行 之后,浏览器连接到 STUN 候选者,但由于服务器是 运行 在 public IP 上,因此这不是必需的,请求失败..
应该采取哪些步骤来进行最小设置,其中浏览器将 RTP 发送到预定义编解码器上的预定义 host/port?