我想检查一下我对 WebRTC 数据通道的理解是否正确,特别是通过改变字典的ordered&maxRetransmits或maxPacketLifeTime属性可以实现的不同类型的通道RTCDataChannelInit。我的以下假设是否正确:
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: true });
maxRetransmits或被maxPacketLifeTime指定以实现可靠性?)Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: false });
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: false, maxRetransmits: 0 });
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: true, maxRetransmits: 0 });
在对我的网络应用程序进行故障排除时,我发现了Draft-mdns-ice-candidates,它是关于使用 mDNS 来混淆候选主机中的地址。
\n我发现,当两个对等点(代理 L、代理 R)处于如下图 7 所示的拓扑时,WebRTC 对等点连接失败,因为代理 R 的主机地址被混淆,并且代理 R 的 srflx 地址被丢弃,因为代理 R 不在 NAT 后面。rfc8445中的相关表述如下。
\n\n\n5.1.3. 消除多余的候选人
\n
\n\n接下来,ICE 代理(发起和响应)消除冗余\n候选者。两个候选者可以具有相同的传输地址,但\n不同的基数,并且这些不会被视为冗余。\n当代理不在 NAT 之后时,\n通常,服务器自反候选者和主机候选者\n将是冗余的。当且仅当一个候选者的传输地址和基址等于另一个候选者的传输地址和基址时,\n该候选者才是冗余的。代理应该消除具有较低优先级的冗余候选。- rfc8445 第 5.1.3 节
\n
\n\n\n
\n\n(图7来自rfc8445的15.1节)
\n
在Draft-mdns-ice-candidates 的第 5 节中,我没有找到有关图 7 的情况的解释。当我测试最新版本的 Chrome、Firefox 和 Safari 时,WebRTC 对等连接在所有浏览器中均失败在图7的情况下,由于我上面写的\xe2\x80\x94的原因,代理R的主机地址被混淆,并且代理R的srflx地址被丢弃。
\n通过更改浏览器设置关闭本地地址混淆(默认情况下进行混淆)时,WebRTC 对等连接已成功建立。(我在 Chrome 和 FireFox 上测试了此成功连接。在 Chrome 中,通过Anonymize local IPs exposed by WebRTC …
我想构建一个网络应用程序来处理来自用户网络摄像头的视频。看起来 WebRTC 是这个项目的理想选择。但是,我很难在用户的机器和 Kubernetes 集群中的 pod 之间创建对等连接。你将如何连接这两个对等点?
Server Fault 上的这个问题讨论了我遇到的问题:WEBRTC MCU/SFU inside kubernetes - Port Ranges。WebRTC 想要打开一堆端口,以便用户可以创建与服务器的对等连接,但 Kubernetes 默认关闭端口。这是我的问题的重新表述:如何创建 RTCPeerConnections 将多个用户连接到托管在 Kubernetes 集群中的应用程序?网络端口应该如何设置?
我最接近找到解决方案的是使用 WebRTC 编排 GPU 加速的流媒体应用程序,它们的代码可在GitHub上找到。我不完全理解他们的方法,我相信这取决于Istio。
我正在开发一个 WebRTC 视频流程序,当用户想要添加视频流时,该程序必须能够重新协商 rtc 连接。因为它是我的程序关闭现有的 RTCPeerConnection 设置变量Connection,null然后创建一个新的 RTCPeerConnection 并重新启动提供/应答交换。
我收到错误:
无法设置远程应答 sdp:应答中的 m 行顺序与报价中的顺序不匹配。拒绝回答。
设置初始连接后。
尽管连接已完全关闭并在两端设置为空,但为什么会发生这种情况?
我正在使用 WebRTC 来促进多人浏览器游戏的点对点连接。选择一个对等点作为其他客户端对等点将连接到的主机。主机对等端同时运行客户端和服务器逻辑。所有客户端(包括主机客户端)都通过 WebRTC 连接到主机的服务器。
有时我会看到这个主机客户端 -> 主机服务器 WebRTC 连接建立失败,原因不明。主机客户端和服务器逻辑在同一个选项卡/Javascript VM 中运行,因此将这种设置可视化为页面内的某种环回连接可能会有所帮助。
失败的连接建立流程如下:
在此流程结束时(大约需要 5 秒),客户端和主机 RTCPeerConnections 都处于以下状态(并且永远不会从这里转换):
RTCPeerConnection.iceConnectionState: "disconnected"
RTCPeerConnection.connectionState: "failed"
RTCPeerConnection.iceGatheringState: "complete"
Run Code Online (Sandbox Code Playgroud)
在此流程中交换的 Offer、Answer 和 ICE Candidates 如下所示:
客户报价
{"type":"offer","sdp":"v=0\r\no=- 8829702333684311109 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic: WMS\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:67dh\r\na=ice-pwd:YxRQGGpaV6OkuogZxjhA3W1l\r\na=ice-options:trickle\r\na=fingerprint:sha-256 D2:13:F7:B5:3B:69:33:5F:40:ED:D9:52:2F:83:EC:B5:5A:D4:7E:0D:1A:08:F5:39:E9:02:AB:4E:7E:6B:50:D9\r\na=setup:actpass\r\na=mid:0\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n"}
Run Code Online (Sandbox Code Playgroud)
主持人回答
{"type":"answer","sdp":"v=0\r\no=- 657100447142081608 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic: WMS\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\nb=AS:30\r\na=ice-ufrag:4eiM\r\na=ice-pwd:JlAUG/0qxZpEsOMT0neKg7LK\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DC:EB:66:5F:C9:73:A9:96:37:7C:A8:21:8E:81:6C:8D:1B:78:47:45:39:76:83:CD:D2:4F:E9:94:72:C7:FD:3B\r\na=setup:active\r\na=mid:0\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n"}
Run Code Online (Sandbox Code Playgroud)
客户 ICE 候选人
{"candidate":"candidate:585712035 1 udp 2113937151 0322602a-bcc1-41b4-96e3-963022b99529.local 55860 typ host generation 0 ufrag 67dh network-cost …我遇到问题,有时我需要重置WebRTC状态(例如,有时我会收到此错误:
无法设置远程商品sdp:处于错误状态:kHaveLocalOffer
但是有可能这样做而无需删除并创建新的RTCPeerConnection对象?我不想停止当前的本地视频捕获...
我正在尝试在没有互联网连接的情况下在用 aiortc 用 Python 编写的相机服务和用 javascript 编写的 Web 前端之间创建 RTCPeerConnection。
camera-service 访问 usb-camera 并为其他两个服务提供流。对于用javascript编写的前端和用python编写的图像分类服务。所有这些服务都在本地主机上的不同端口上运行。我需要在没有互联网连接的情况下完成这项工作。
两个python服务之间的RTCPeerConnection在没有互联网连接的情况下工作,但前端和camera-service之间的连接不起作用。
如果没有互联网连接,相机服务的 ICEConnectionState 永远不会完成,只是检查,所以我认为这是某种问题。
要重现此问题,只需尝试使用 aiortc ( https://github.com/aiortc/aiortc/tree/master/examples/webcam )的网络摄像头示例,无论是否有互联网连接。
javascript中的前端
var pc = new RTCPeerConnection({
"iceServers": []
});
//start the negotiating process with camera-service(running on localhost:8080)
function negotiate() {
pc.addTransceiver('video', {direction: 'recvonly'});
return pc.createOffer().then(function(offer) {
return pc.setLocalDescription(offer);
}).then(function() {
// wait for ICE gathering to complete
return new Promise(function(resolve) {
if (pc.iceGatheringState === 'complete') {
resolve();
} else {
function checkState() {
if (pc.iceGatheringState === 'complete') …Run Code Online (Sandbox Code Playgroud) 我想以2秒的间隔记录本地和远程流并用Ajax上传到服务器。但问题是,ondataavailable 方法被调用了两次,因此同一个视频被上传到服务器两次。第一个视频可以正常播放,而其余视频要么已损坏,要么非常小(不到一秒)。所有视频的大小几乎相同!
我也尝试过 MediaRecorder API,但问题是一样的。我尝试过 5 秒的间隔,但仍然没有成功!
这就是我获取本地流的方式:
navigator.mediaDevices.getUserMedia({
video: false,
audio: true
}).then(function (myStream) {
localStream = myStream;
localStream.getTracks().forEach(function (track) {
yourConn.addTrack(track, localStream);
});
}).catch(function (error) {
streamAdded = false;
console.warn('Could not detect microphone');
return false;
});
Run Code Online (Sandbox Code Playgroud)
这就是我执行录音的方式:
yourConn.ontrack = function (e) {
remoteVideo.srcObject = e.streams[0];
let recorder = RecordRTC([localStream, e.streams[0]], {
mimeType: 'video/webm;codecs=h264',
type: 'video',
timeSlice: 5000,
ondataavailable: function(blob) {
uploadBlob(blob);
},
});
recorder.startRecording();
}
Run Code Online (Sandbox Code Playgroud)
上传Blob函数:
var formData = new FormData();
formData.append('recorded_file', mp4File);
$.ajax({
url: myURL,
data: formData, …Run Code Online (Sandbox Code Playgroud) 几年前实现了一种机制,用于通过数据通道消息发出信号,表明远程用户将其本地视频静音(例如,将启用设置为 false),然后在远程端采取适当的操作(例如,改为显示远程用户头像)的黑色视频流),我一直在对一个非直接相关的功能进行一些测试,这让我查看了视频轨道的状态(即对等连接的接收流上的视频轨道),并且我注意到远程视频的静音状态有时会在 true 和 false 之间波动(尽管远程流本身没有实际变化)。
很难确切地说这种情况何时发生,但似乎它可能(不知道是否确实如此)与长时间不将媒体附加到对象(例如,用于播放的 HTML 视频元素)相关(例如,10 秒),并且似乎如果在短时间内附加,则视频轨道在接收端不会显示 muted=true 的状态。
W3 媒体捕获和流规范(请参阅https://w3c.github.io/mediacapture-main/#track-muted)“当源暂时无法向轨道提供数据时,MediaStreamTrack 将静音。轨道可以由用户静音。通常此操作超出应用程序的控制范围。这可能是由于用户按下硬件开关或切换操作系统/浏览器镶边中的控件造成的。用户也可以将曲目静音代理人。” 该规范似乎没有解决造成这种情况的原因或可能的原因。
就 webRTC 而言,任何人都可以提供一些指示,说明为什么当来自远程的媒体实际流动时,从 webrtc 对等连接引用的远程视频流可能会显示静音状态 true。此外,当远程视频流上的静音状态实际上并不反映远程状态而是反映某些本地处理时,它的实际价值或用途可能是什么。
感谢您对此的任何想法。
我希望逻辑上没有缺陷。
步骤1:呼叫者创建报价
步骤2:呼叫者设置localDescription
步骤3:呼叫者将描述发送给被呼叫者
// ------------------------------------------------ ------ //
步骤4:被叫方收到要约集的远程描述
步骤5:被叫方创建答案
步骤6:被叫方设置本地描述
步骤7:被呼叫者将说明发送给呼叫者
// ------------------------------------------------ ------ //
步骤8:呼叫者收到答案并设置远程描述
这是上面的代码
const socket = io();
const constraints = {
audio: true,
video: true
};
const configuration = {
iceServers: [{
"url": "stun:23.21.150.121"
}, {
"url": "stun:stun.l.google.com:19302"
}]
};
const selfView = $('#selfView')[0];
const remoteView = $('#remoteView')[0];
var pc = new RTCPeerConnection(configuration);
pc.onicecandidate = ({
candidate
}) => {
socket.emit('message', {
to: $('#remote').val(),
candidate: candidate
}); …Run Code Online (Sandbox Code Playgroud) webrtc ×10
javascript ×6
browser ×1
kubernetes ×1
localhost ×1
mdns ×1
mediastream ×1
python ×1
recordrtc ×1
sdp ×1