【问题标题】:Simple Webrtc relay bridge Server in C#C#中的简单Webrtc中继桥服务器
【发布时间】:2020-04-13 03:44:02
【问题描述】:

我有一个可以正常工作的 peerTopeer (P1, P2) webRTC。为了处理 peerTopeer 故障,我正在尝试通过 c# 中的服务器在 Windows 机器上的 P1 和 P2 之间进行简单的字节交换,因为我不想按规范开发转向服务器。我还尝试使用turn message 找到一个开源c# 服务器turn server,但它不起作用(能够解析请求,但响应似乎不被最新的基于铬/MS Edge 铬的接受)

简单的 C# 中继桥服务器:

使用简单的 udp/tcp 侦听器并与对等方交换字节(P1 到 P2 和 P2 到 P1)并强制桥接机器 IP 作为候选 我能够实现连接和流数据(字节)的交换。 但是,无法在对等方上看到视频/听到音频,并且在进行了一些交换之后,连接被丢弃,客户端连接状态失败

第一季度。应该可以了,怎么回事?

第二季度。任何 stun and turn 的开源 c# 实现(简单)?

感谢您在这方面的任何帮助。


服务器和客户端代码示例:

监听 tcp / udp(不在示例中)

public void ListenTCP(int port) {
        TcpListener listener = new TcpListener(IPAddress.Any, port);
        listener.Start();
        while (true){
            TcpClient tcpClient = listener.AcceptTcpClient();
            ..........add endpoint to list
            var bytes = readfromtcpstream.......;
            Task.Run(() => ProcessData(tcpClient.Client.RemoteEndPoint, bytes));
        }
    }

ProcessData(交换流字节)

private void Process_DATA(IPEndPoint fromEndPoint, byte[] bytes) {
        foreach (var endpoint in list) { //distribute to all other peers
            if (endpoint == fromEndPoint) continue;
            endpoint's TCPClient.Send(bytes);
        }
    }

在客户端(Javascript / typescript),强制候选人作为桥接服务器

SignalType.Candidate...
candidate = new RTCIceCandidate(Switch the SDP(messageJson.candidate,
                    BridgeServerAddress, "2525", "tcp"));
m_PeerConnection.addIceCandidate(candidate)

【问题讨论】:

  • 您是否正在尝试将您的信令服务器与 TURN 复用?
  • 我正在尝试使用 TURN 之类的服务器多路复用流数据,类似于 SFU 盒或那种但非常简单的服务器
  • TURN is 用于在由于 NAT 故障而无法直接连接的对等方之间建立流数据隧道。当您说“流数据”时,您指的是信令过程吗?
  • 不,信号不是问题。它是一个没有 TURN 的“PeerBridgePeer”。如果这无法实现,我也在寻找在 C# 中拥有自己的 TURN 服务器的简单方法
  • TURN 是唯一受支持的 P2P 网桥。如果你想实现一个非标准的替代方案,你不会发现浏览器支持基于 UDP 的流式传输,除非从对等方的角度来看,它与 TURN 协议无法区分。

标签: c# server webrtc relay turn


【解决方案1】:

简单地修改从 P2P 获得的候选冰不太可能起作用,因为 TCP 候选的工作方式略有不同。 TURN 服务器与简单的网桥有很大不同。

下面的 SDP 包含一个 tcptype 被动的 TCP 候选,它将使另一端建立到它的连接。将其输入 setRemoteDescription,然后创建一个答案并使用该答案调用 setLocalDescription。

v=0
o=- 2576067654554894849 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2698387310 1 tcp 25042943 127.0.0.1 31337 typ host tcptype passive generation 0
a=ice-ufrag:server
a=ice-pwd:Kv6yCw1HiZ1/6uNExYcE28pO
a=fingerprint:sha-256 22:46:36:8D:B1:CD:08:7B:A1:60:86:BF:95:90:06:4B:EA:47:D9:74:24:FF:6D:2F:1C:09:5B:C1:F5:8D:CC:B2
a=setup:actpass
a=mid:audio
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=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1

浏览器应该在 localhost 上建立与端口 31337 的连接(请注意,Firefox 默认不允许 localhost ICE,因此请先在 Chrome 中尝试此操作)。 从那里,您必须处理 ICE、解密 SRTP 等。

【讨论】:

  • 您好,我目前正在开发一个群呼,我正在开发 ios 应用程序,当双方都有彼此的 SDP 但屏幕为黑色时,当我打电话时,我很难过有一个安卓应用程序,我的视频流就在那里。你知道如何解决这个问题吗,我花了很多时间来回答这个问题。对不起我的英语水平。
  • @HiềnĐỗ 我也遇到了类似的问题,向 PC 添加流/音轨“仅一次”解决了这些问题。还尝试检查stream.id。它非常精致,但如果操作正确,它肯定会起作用!
  • @Guru_07 感谢您的回答,我已经为 localview 设置了一个 streamID = "stream",但我不太了解这个 id 设置,接下来我应该如何处理这个 streamId?
  • @HiềnĐỗ 这是对我有用的示例代码(空白视频问题):在 PeerConnection.ontrack 事件中,如果 (targetPeerConnection[stream.id]) 返回; // 流已经添加 targetPeerConnection[stream.id] = true;希望这对你有用。注意:我正在使用 webrtc adapter.js 并且 stream.id 已经设置(我只是在使用它)
  • @Philipp Hancke:感谢您的建议。由于它是被动的,传入的连接由于防火墙和 NAT 等而被阻止。每个客户端只能访问服务器!
猜你喜欢
  • 2021-07-13
  • 2018-09-29
  • 2018-06-11
  • 2017-11-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多