webrtc多人在线视频通讯

GitHub项目地址:https://github.com/lzming9511/webrtc

webrtc多人在线视频通讯项目,采用P2P点对点连接,后端服务只进行信令的交换,不参与音频流的交换,服务端的压力小

1.发起请求的客服端发送_offer到服务端,服务端群发给同房间的接收的客服端

2.发起请求的客服端发送_ice_candidate到服务端,服务端群发给同房间的接收的客服端

3.发起请求的客服端接收到_offer信令,给服务器回复_answer,服务器发送给发起请求的客服端

4.发起请求的客服端接收到_ice_candidate信令,给服务器回复_ice_candidate,服务器发送给发起请求的客服端

通过上面4个步骤实现信令的交换,webrtc知道要连接哪个地址,webrtc通过p2p进行点对点的连接

rev服务端收到 客服端1 消息:	{"event":"_offer","data":{"sdp":{"type":"offer","sdp":"v=0\r\no=- 4384462181796616779 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Imys\r\na=ice-pwd:Ax+qGfBB82LoJRxTeEI8kH3k\r\na=ice-options:trickle\r\na=fingerprint:sha-256 E9:37:F9:56:C9:D6:0D:5A:C7:5E:11:3B:FF:99:91:C3:E0:25:F1:BA:2D:A6:45:4E:B5:B4:A3:B6:CD:A8:7B:B0\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:757630844 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:757630844 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 099b799e-7678-4eac-bd04-0934c32a8530\r\na=ssrc:757630844 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:757630844 label:099b799e-7678-4eac-bd04-0934c32a8530\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Imys\r\na=ice-pwd:Ax+qGfBB82LoJRxTeEI8kH3k\r\na=ice-options:trickle\r\na=fingerprint:sha-256 E9:37:F9:56:C9:D6:0D:5A:C7:5E:11:3B:FF:99:91:C3:E0:25:F1:BA:2D:A6:45:4E:B5:B4:A3:B6:CD:A8:7B:B0\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 red/90000\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4154594995 2598090200\r\na=ssrc:4154594995 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:4154594995 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:4154594995 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:4154594995 label:70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:2598090200 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:2598090200 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:2598090200 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:2598090200 label:70d76e71-7726-4f52-ac28-95fca16cf228\r\n"}}}
send服务器发送给 客服端0 消息:{"event":"_offer","data":{"sdp":{"type":"offer","sdp":"v=0\r\no=- 4384462181796616779 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Imys\r\na=ice-pwd:Ax+qGfBB82LoJRxTeEI8kH3k\r\na=ice-options:trickle\r\na=fingerprint:sha-256 E9:37:F9:56:C9:D6:0D:5A:C7:5E:11:3B:FF:99:91:C3:E0:25:F1:BA:2D:A6:45:4E:B5:B4:A3:B6:CD:A8:7B:B0\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:757630844 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:757630844 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 099b799e-7678-4eac-bd04-0934c32a8530\r\na=ssrc:757630844 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:757630844 label:099b799e-7678-4eac-bd04-0934c32a8530\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Imys\r\na=ice-pwd:Ax+qGfBB82LoJRxTeEI8kH3k\r\na=ice-options:trickle\r\na=fingerprint:sha-256 E9:37:F9:56:C9:D6:0D:5A:C7:5E:11:3B:FF:99:91:C3:E0:25:F1:BA:2D:A6:45:4E:B5:B4:A3:B6:CD:A8:7B:B0\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 red/90000\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4154594995 2598090200\r\na=ssrc:4154594995 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:4154594995 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:4154594995 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:4154594995 label:70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:2598090200 cname:ykf1Sa1gQQw6svQF\r\na=ssrc:2598090200 msid:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o 70d76e71-7726-4f52-ac28-95fca16cf228\r\na=ssrc:2598090200 mslabel:rQ2fkIWHNlMQMYCxNYUdr80O1riSyJ9O9k4o\r\na=ssrc:2598090200 label:70d76e71-7726-4f52-ac28-95fca16cf228\r\n"}}}
rev服务端收到 客服端1 消息:	{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49631 typ host generation 0 ufrag Imys network-cost 50","sdpMid":"audio","sdpMLineIndex":0}}}
send服务器发送给 客服端0 消息:{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49631 typ host generation 0 ufrag Imys network-cost 50","sdpMid":"audio","sdpMLineIndex":0}}}
rev服务端收到 客服端1 消息:	{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49633 typ host generation 0 ufrag Imys network-cost 50","sdpMid":"video","sdpMLineIndex":1}}}
send服务器发送给 客服端0 消息:{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49633 typ host generation 0 ufrag Imys network-cost 50","sdpMid":"video","sdpMLineIndex":1}}}
rev服务端收到 客服端0 消息:	{"event":"_answer","data":{"sdp":{"type":"answer","sdp":"v=0\r\no=- 2387596707289326636 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:vu+3\r\na=ice-pwd:aqMVjGj1Hz8ziy3PB+I1QY3y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F3:66:9C:C3:2D:0B:90:17:47:BB:30:B3:6D:F5:24:5C:87:E8:71:56:D1:C0:00:7D:08:CB:AA:84:18:98:6E:71\r\na=setup:active\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3611041506 cname:reYQqYdSFjANuTK6\r\na=ssrc:3611041506 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR 1f05dacf-9044-4f52-8823-6a48d5ac4e47\r\na=ssrc:3611041506 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:3611041506 label:1f05dacf-9044-4f52-8823-6a48d5ac4e47\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:vu+3\r\na=ice-pwd:aqMVjGj1Hz8ziy3PB+I1QY3y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F3:66:9C:C3:2D:0B:90:17:47:BB:30:B3:6D:F5:24:5C:87:E8:71:56:D1:C0:00:7D:08:CB:AA:84:18:98:6E:71\r\na=setup:active\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 red/90000\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4142159662 3050859437\r\na=ssrc:4142159662 cname:reYQqYdSFjANuTK6\r\na=ssrc:4142159662 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:4142159662 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:4142159662 label:fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:3050859437 cname:reYQqYdSFjANuTK6\r\na=ssrc:3050859437 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:3050859437 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:3050859437 label:fe5233ce-203d-42e0-8e1a-19c2745781b8\r\n"}}}
send服务器发送给 客服端1 消息:{"event":"_answer","data":{"sdp":{"type":"answer","sdp":"v=0\r\no=- 2387596707289326636 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:vu+3\r\na=ice-pwd:aqMVjGj1Hz8ziy3PB+I1QY3y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F3:66:9C:C3:2D:0B:90:17:47:BB:30:B3:6D:F5:24:5C:87:E8:71:56:D1:C0:00:7D:08:CB:AA:84:18:98:6E:71\r\na=setup:active\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3611041506 cname:reYQqYdSFjANuTK6\r\na=ssrc:3611041506 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR 1f05dacf-9044-4f52-8823-6a48d5ac4e47\r\na=ssrc:3611041506 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:3611041506 label:1f05dacf-9044-4f52-8823-6a48d5ac4e47\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:vu+3\r\na=ice-pwd:aqMVjGj1Hz8ziy3PB+I1QY3y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F3:66:9C:C3:2D:0B:90:17:47:BB:30:B3:6D:F5:24:5C:87:E8:71:56:D1:C0:00:7D:08:CB:AA:84:18:98:6E:71\r\na=setup:active\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 red/90000\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4142159662 3050859437\r\na=ssrc:4142159662 cname:reYQqYdSFjANuTK6\r\na=ssrc:4142159662 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:4142159662 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:4142159662 label:fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:3050859437 cname:reYQqYdSFjANuTK6\r\na=ssrc:3050859437 msid:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR fe5233ce-203d-42e0-8e1a-19c2745781b8\r\na=ssrc:3050859437 mslabel:Q9o54prg6ybvH4j9gouzeNZhyxfEAvSFNuQR\r\na=ssrc:3050859437 label:fe5233ce-203d-42e0-8e1a-19c2745781b8\r\n"}}}
rev服务端收到 客服端0 消息:	{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49635 typ host generation 0 ufrag vu+3 network-cost 50","sdpMid":"audio","sdpMLineIndex":0}}}
send服务器发送给 客服端1 消息:{"event":"_ice_candidate","data":{"candidate":{"candidate":"candidate:2201212986 1 udp 2113937151 172.18.1.229 49635 typ host generation 0 ufrag vu+3 network-cost 50","sdpMid":"audio","sdpMLineIndex":0}}}

 

 

服务端采用spootboot实现websocket

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <!-- webstock相关依赖包. -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>

客服端webrtc

//兼容不同浏览器获取到用户媒体对象
    var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.mediaDevices.getUserMedia);

var sessionList=[]
    var pcList=[];//建立多个PeerConnection实现相互之间的点对点
    function createPeerConnection(clientID) {
        //兼容不同浏览器客户端之间的连接
        pcList[clientID] = new (window.PeerConnection || window.webkitPeerConnection00 || window.webkitRTCPeerConnection || window.mozRTCPeerConnection);
        //兼容不同浏览器
        sessionList[clientID] = (window.RTCSessionDescription || window.mozRTCSessionDescription || window.webkitRTCSessionDescription);

        pcList[clientID].addStream(localhostStream);
        // 发送ICE候选到其他客户端
        pcList[clientID].onicecandidate = function (event) {
            if (event.candidate !== null) {
                websocket.send(JSON.stringify({
                    "event" : "_ice_candidate",
                    "clientId" : myID,
                    "roomID" :roomID,
                    "respon" :clientID,
                    "data" : {
                        "candidate" : event.candidate
                    }
                }));
            }
        };
        // 如果检测到媒体流连接到本地,将其绑定到一个video标签上输出
        pcList[clientID].onaddstream = function (event) {
            var node=document.createElement("video");
            node.setAttribute("width",640);
            node.setAttribute("height",480);
            node.setAttribute("autoplay","autoplay");
            node.setAttribute("id","video"+clientID);
            node.setAttribute("src",URL.createObjectURL(event.stream));
            document.getElementById('videoList').appendChild(node);
        };
        //return pcList[clientID];
    }

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值