index.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <html>
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>demo</title>
  8. <style>
  9. html,
  10. body {
  11. overflow: hidden;
  12. width: 100%;
  13. height: 100%;
  14. margin: 0;
  15. padding: 0;
  16. }
  17. #renderCanvas {
  18. width: 100%;
  19. height: 100%;
  20. touch-action: none;
  21. }
  22. #videoTextureBox video {
  23. display: none;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <canvas id="renderCanvas"></canvas>
  29. <div
  30. id="testVideoFeed"
  31. style="
  32. position: fixed;
  33. width: 300px;
  34. height: 300px;
  35. z-index: 10000;
  36. top: 0;
  37. left: 0;
  38. "
  39. >
  40. <video crossorigin="anonymous" playsinline autoplay muted></video>
  41. </div>
  42. <div id="videoTextureBox">
  43. <video
  44. id="houseTexture0"
  45. src="./textures/outputmp4/0/0.mp4"
  46. crossorigin="anonymous"
  47. playsinline
  48. autoplay
  49. muted
  50. loop
  51. ></video>
  52. </div>
  53. <!-- Babylon.js -->
  54. <script src="./libs/dat.gui.min.js"></script>
  55. <script src="./libs/ammo.js"></script>
  56. <script src="./libs/cannon.js"></script>
  57. <script src="./libs/Oimo.js"></script>
  58. <script src="./libs/earcut.min.js"></script>
  59. <script src="./libs/recast.js"></script>
  60. <script src="./libs/babylon.js"></script>
  61. <script src="./libs/babylonjs.materials.min.js"></script>
  62. <script src="./libs/babylonjs.proceduralTextures.min.js"></script>
  63. <script src="./libs/babylonjs.postProcess.min.js"></script>
  64. <script src="./libs/babylonjs.loaders.js"></script>
  65. <script src="./libs/babylonjs.serializers.min.js"></script>
  66. <script src="./libs/babylon.gui.min.js"></script>
  67. <script src="./libs/babylon.inspector.bundle.js"></script>
  68. <script src="./libs/socket.2.3.js"></script>
  69. <script type="module">
  70. import App from "./modules/index.js";
  71. var canvas = document.getElementById("renderCanvas");
  72. var engine = null;
  73. var scene = null;
  74. var sceneToRender = null;
  75. var startRenderLoop = function (engine, canvas) {
  76. engine.runRenderLoop(function () {
  77. if (sceneToRender && sceneToRender.activeCamera) {
  78. sceneToRender.render();
  79. }
  80. });
  81. };
  82. var createDefaultEngine = function () {
  83. return new BABYLON.Engine(canvas, true, {
  84. preserveDrawingBuffer: true,
  85. stencil: true,
  86. disableWebGL2Support: false,
  87. });
  88. };
  89. var asyncEngineCreation = async function () {
  90. try {
  91. return createDefaultEngine();
  92. } catch (e) {
  93. console.log(
  94. "the available createEngine function failed. Creating the default engine instead"
  95. );
  96. return createDefaultEngine();
  97. }
  98. };
  99. window.initFunction = async function () {
  100. engine = await asyncEngineCreation();
  101. if (!engine) throw "engine should not be null.";
  102. startRenderLoop(engine, canvas);
  103. engine.enableOfflineSupport = false;
  104. // Scene and Camera
  105. window.app = new App(engine);
  106. scene = window.app.scene;
  107. };
  108. initFunction().then(() => {
  109. sceneToRender = scene;
  110. });
  111. window.scene = scene;
  112. window.engine = engine;
  113. // Resize
  114. window.addEventListener("resize", function () {
  115. engine.resize();
  116. });
  117. </script>
  118. <!-- worker -->
  119. <!-- <script src="./worker/decoderWorker.js"></script> -->
  120. <script src="./worker/index.js" type="module"></script>
  121. <script type="module">
  122. import { Connection } from "./webrtc/connection.js";
  123. document.addEventListener("DOMContentLoaded", async () => {
  124. const connection = new Connection();
  125. window.connection = connection;
  126. const testConfig = {
  127. userId: "11use2221ttttt2553",
  128. roomId: "tk12291",
  129. sdkAppId: 1400653314,
  130. // role: "audience",
  131. role: "audience",
  132. sceneCode: "2111",
  133. };
  134. connection.init(testConfig, async () => {
  135. if (connection.client) {
  136. await connection.client.join({ roomId: testConfig.roomId });
  137. console.log("userSig", connection.userSig);
  138. connection.socket.emit("getPush", {
  139. userId: testConfig.userId,
  140. roomId: testConfig.roomId,
  141. sceneCode: testConfig.sceneCode,
  142. userSig: connection.userSig,
  143. });
  144. connection.socket.on("getPush", (data) => {
  145. console.log(
  146. "getPush",
  147. `ffmpeg -loglevel info -re -stream_loop -1 -i test.mkv -c:v libx264 -preset fast -profile:v baseline -g 30 -sc_threshold 0 -b:v 1500k -f flv "${data}"`
  148. );
  149. });
  150. console.log("connection.client", connection.client);
  151. connection.client.on("peer-join", (event) => {
  152. console.log("peer-join", event);
  153. });
  154. connection.client.on("stream-added", (event) => {
  155. const remoteStream = event.stream;
  156. const remoteUserId = remoteStream.getUserId();
  157. console.warn(
  158. "received a remoteStream ID: " +
  159. remoteStream.getId() +
  160. " from user: " +
  161. remoteUserId
  162. );
  163. // 若需要观看该远端流,则需要订阅它
  164. connection.client.subscribe(remoteStream);
  165. });
  166. // connection.client.on('network-quality', event => {
  167. // console.log(`network-quality, uplinkNetworkQuality:${event.uplinkNetworkQuality}, downlinkNetworkQuality: ${event.downlinkNetworkQuality}`)
  168. // // 自 v4.10.3 支持获取上、下行的 RTT 及丢包率
  169. // console.log(`uplink rtt:${event.uplinkRTT} loss:${event.uplinkLoss}`)
  170. // console.log(`downlink rtt:${event.downlinkRTT} loss:${event.downlinkLoss}`)
  171. // })
  172. connection.client.on("stream-subscribed", (event) => {
  173. const remoteStream = event.stream;
  174. // 远端流订阅成功,在HTML页面中创建一个<video>标签,假设该标签ID为‘remote-video-view’
  175. // 播放该远端流
  176. // console.log("remoteStream", remoteStream);
  177. // remoteStream.resume();
  178. remoteStream.play("testVideoFeed");
  179. const frame = remoteStream.getVideoFrame();
  180. const track = remoteStream.getVideoTrack();
  181. console.warn("frame", frame, track);
  182. console.warn("frame", remoteStream);
  183. });
  184. connection.client.on("error", (event) => {
  185. console.log("error", event);
  186. });
  187. connection.client.on("connection-state-changed", (event) => {
  188. console.warn("connection-state-changed", event);
  189. });
  190. // 监听‘stream-removed’事件
  191. connection.client.on("stream-removed", (event) => {
  192. const remoteStream = event.stream;
  193. console.log(
  194. "remoteStream ID: " +
  195. remoteStream.getId() +
  196. " has been removed"
  197. );
  198. // 停止播放并删除相应<video>标签
  199. });
  200. // 监听‘stream-updated’事件
  201. connection.client.on("stream-updated", (event) => {
  202. const remoteStream = event.stream;
  203. console.warn(
  204. "remoteStream ID: " +
  205. remoteStream.getId() +
  206. " was updated hasAudio: " +
  207. remoteStream.hasAudio() +
  208. " hasVideo: " +
  209. remoteStream.hasVideo()
  210. );
  211. });
  212. // 监听‘stream-subscribed’事件
  213. }
  214. });
  215. });
  216. </script>
  217. </body>
  218. <script src="https://web.sdk.qcloud.com/trtc/webrtc/demo/latest/dist/trtc.js"></script>
  219. </html>
  220. </html>