sendAnswer.html 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Answer</title>
  6. <style>
  7. #v2 {
  8. width: 500px;
  9. height: 500px;
  10. border: solid 1px red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <video id="v2" autoPlay muted playsinline></video>
  16. <script>
  17. (async () => {
  18. const socket = new WebSocket("ws://192.168.137.253:8881");
  19. await new Promise((r) => (socket.onopen = r));
  20. console.log("open websocket");
  21. const offer = await new Promise((r) => (socket.onmessage = (ev) => r(JSON.parse(ev.data))));
  22. console.log("offer", offer.sdp);
  23. const peer = new RTCPeerConnection({
  24. iceServers: [
  25. {
  26. urls: [
  27. "stun:caner.top:3478",
  28. ],
  29. },
  30. {
  31. urls: "turn:caner.top:3478",
  32. username: "admin",
  33. credential: "123456"
  34. },
  35. ]
  36. });
  37. peer.onicecandidate = ({ candidate }) => {
  38. if (!candidate) {
  39. const sdp = JSON.stringify(peer.localDescription);
  40. socket.send(sdp);
  41. }
  42. };
  43. peer.oniceconnectionstatechange = () => {
  44. console.log("oniceconnectionstatechange", peer.iceConnectionState);
  45. };
  46. peer.ontrack = (e) => {
  47. console.log("ontrack", e);
  48. const video = document.getElementById('v2')
  49. if (video.srcObject) {
  50. video.srcObject.addTrack(e.track);
  51. } else {
  52. video.srcObject = new MediaStream([e.track]);
  53. }
  54. peer.getReceivers().forEach((r) => {
  55. r.playoutDelayHint = 1;
  56. r.jitterBufferDelayHint = 1;
  57. });
  58. };
  59. await peer.setRemoteDescription(offer);
  60. const answer = await peer.createAnswer();
  61. await peer.setLocalDescription(answer);
  62. })()
  63. </script>
  64. </body>
  65. </html>