index.htm 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Answer</title>
  6. <script
  7. crossorigin
  8. src="https://unpkg.com/react@16/umd/react.development.js"
  9. ></script>
  10. <script
  11. crossorigin
  12. src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
  13. ></script>
  14. <script
  15. crossorigin
  16. src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"
  17. ></script>
  18. <script src="https://cdn.jsdelivr.net/npm/babel-regenerator-runtime@6.5.0/runtime.min.js"></script>
  19. </head>
  20. <body>
  21. <div class="main">
  22. <div class="section" id="app1"></div>
  23. </div>
  24. <script type="text/babel">
  25. let rtc;
  26. const App = () => {
  27. const [log, setLog] = React.useState([]);
  28. const videoRef = React.useRef();
  29. React.useEffect(() => {
  30. (async () => {
  31. const socket = new WebSocket("ws://localhost:8888");
  32. await new Promise((r) => (socket.onopen = r));
  33. console.log("open websocket");
  34. const offer = await new Promise(
  35. (r) => (socket.onmessage = (ev) => r(JSON.parse(ev.data)))
  36. );
  37. console.log("offer", offer.sdp);
  38. const peer = (rtc = new RTCPeerConnection({
  39. iceServers: [],
  40. }));
  41. peer.onicecandidate = ({ candidate }) => {
  42. if (!candidate) {
  43. const sdp = JSON.stringify(peer.localDescription);
  44. socket.send(sdp);
  45. }
  46. };
  47. peer.oniceconnectionstatechange = () => {
  48. console.log(
  49. "oniceconnectionstatechange",
  50. peer.iceConnectionState
  51. );
  52. };
  53. peer.ontrack = (e) => {
  54. console.log("ontrack", e);
  55. videoRef.current.srcObject = e.streams[0];
  56. };
  57. await peer.setRemoteDescription(offer);
  58. const answer = await peer.createAnswer();
  59. await peer.setLocalDescription(answer);
  60. })();
  61. }, []);
  62. return (
  63. <div>
  64. answer
  65. <video ref={videoRef} autoPlay muted />
  66. </div>
  67. );
  68. };
  69. ReactDOM.render(<App />, document.getElementById("app1"));
  70. </script>
  71. </body>
  72. </html>