index.html 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>car</title>
  8. <script src="./socket.io.min.js"></script>
  9. <style>
  10. video {
  11. width: 500px;
  12. height: 400px;
  13. background: none;
  14. object-fit: fill;
  15. border: solid 1px red;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div>
  21. <video id="v2" autoplay playsinline></video>
  22. </div>
  23. <!-- webrtc -->
  24. <script>
  25. let RTC = null
  26. const socket = io({
  27. auth: {
  28. roomID: "feiCar",
  29. name: "ctrl",
  30. },
  31. transports: ["websocket"],
  32. });
  33. socket.on("connect", async () => {
  34. const PeerConnection =
  35. window.RTCPeerConnection ||
  36. window.mozRTCPeerConnection ||
  37. window.webkitRTCPeerConnection;
  38. RTC = new PeerConnection();
  39. RTC.ontrack = (event) => {
  40. const remoteVideo = document.getElementById("v2");
  41. remoteVideo.srcObject = event.streams;
  42. console.log("远程流|dom", event, remoteVideo);
  43. };
  44. // 监听ICE|发送
  45. RTC.onicecandidate = (event) => {
  46. if (event.candidate) {
  47. socket.emit("msg", {
  48. type: "candidate",
  49. candidate: event.candidate,
  50. });
  51. console.log("己方ICE", event.candidate);
  52. }
  53. };
  54. // 监听ICE状态
  55. RTC.oniceconnectionstatechange = () => {
  56. console.log("ICE状态", RTC.iceConnectionState);
  57. };
  58. console.log("连接成功监听webrtc");
  59. });
  60. // 发送offer及anwser
  61. socket.on("msg", async (data) => {
  62. console.log("用户信息", data);
  63. if (data.type === 'offer') {
  64. // 设置本地应答
  65. RTC.setRemoteDescription(data.offer);
  66. // 返回应答
  67. const answer = await RTC.createAnswer();
  68. RTC.setLocalDescription(answer);
  69. // 发送anwser
  70. socket.emit("msg", {
  71. type: "answer",
  72. answer: answer,
  73. });
  74. } else if (data.type === 'candidate') {
  75. // 添加ICE
  76. RTC.addIceCandidate(data.candidate);
  77. }
  78. });
  79. // 监听加入
  80. socket.on('joined', user => {
  81. console.log(`${user.name}加入${user.roomID}房间`)
  82. // 向其它用户发送开始webrtc
  83. socket.emit('msg', {
  84. type: 'startRTC'
  85. })
  86. })
  87. // 监听离开
  88. socket.on('leaved', user => {
  89. console.log(`${user.name}离开${user.roomID}房间`)
  90. RTC.close()
  91. })
  92. // 断开连接
  93. socket.on("connect_error", (err) => {
  94. console.log("连接错误", err);
  95. if (RTC) RTC.close()
  96. });
  97. </script>
  98. </body>
  99. </html>