index.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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. ></video>
  51. </div>
  52. <!-- Babylon.js -->
  53. <script src="./libs/dat.gui.min.js"></script>
  54. <script src="./libs/ammo.js"></script>
  55. <script src="./libs/cannon.js"></script>
  56. <script src="./libs/Oimo.js"></script>
  57. <script src="./libs/earcut.min.js"></script>
  58. <script src="./libs/recast.js"></script>
  59. <script src="./libs/babylon.js"></script>
  60. <script src="./libs/babylonjs.materials.min.js"></script>
  61. <script src="./libs/babylonjs.proceduralTextures.min.js"></script>
  62. <script src="./libs/babylonjs.postProcess.min.js"></script>
  63. <script src="./libs/babylonjs.loaders.js"></script>
  64. <script src="./libs/babylonjs.serializers.min.js"></script>
  65. <script src="./libs/babylon.gui.min.js"></script>
  66. <script src="./libs/babylon.inspector.bundle.js"></script>
  67. <script src="./libs/socket.2.3.js"></script>
  68. <script type="module">
  69. import App from "./modules/index.js";
  70. var canvas = document.getElementById("renderCanvas");
  71. var engine = null;
  72. var scene = null;
  73. var sceneToRender = null;
  74. var startRenderLoop = function (engine, canvas) {
  75. engine.runRenderLoop(function () {
  76. if (sceneToRender && sceneToRender.activeCamera) {
  77. sceneToRender.render();
  78. }
  79. });
  80. };
  81. var createDefaultEngine = function () {
  82. return new BABYLON.Engine(canvas, true, {
  83. preserveDrawingBuffer: true,
  84. stencil: true,
  85. disableWebGL2Support: false,
  86. });
  87. };
  88. var asyncEngineCreation = async function () {
  89. try {
  90. return createDefaultEngine();
  91. } catch (e) {
  92. console.log(
  93. "the available createEngine function failed. Creating the default engine instead"
  94. );
  95. return createDefaultEngine();
  96. }
  97. };
  98. window.initFunction = async function () {
  99. engine = await asyncEngineCreation();
  100. if (!engine) throw "engine should not be null.";
  101. startRenderLoop(engine, canvas);
  102. engine.enableOfflineSupport = false;
  103. // Scene and Camera
  104. window.app = new App(engine);
  105. scene = window.app.scene;
  106. };
  107. initFunction().then(() => {
  108. sceneToRender = scene;
  109. });
  110. window.scene = scene;
  111. window.engine = engine;
  112. // Resize
  113. window.addEventListener("resize", function () {
  114. engine.resize();
  115. });
  116. </script>
  117. <!-- worker -->
  118. <!-- <script src="./worker/decoderWorker.js"></script> -->
  119. <script src="./worker/index.js" type="module"></script>
  120. <script type="module">
  121. import { Connection } from "./webrtc/connection.js";
  122. document.addEventListener("DOMContentLoaded", async () => {
  123. const connection = new Connection();
  124. window.connection = connection;
  125. const testConfig = {
  126. userId: "11use2221ttttt2553",
  127. roomId: "tk12291",
  128. sdkAppId: 1400653314,
  129. // role: "audience",
  130. role: "audience",
  131. sceneCode: "2111",
  132. };
  133. connection.init(testConfig, async () => {
  134. if (connection.client) {
  135. await connection.client.join({ roomId: testConfig.roomId });
  136. console.log("userSig", connection.userSig);
  137. connection.socket.emit("getPush", {
  138. userId: testConfig.userId,
  139. roomId: testConfig.roomId,
  140. sceneCode: testConfig.sceneCode,
  141. userSig: connection.userSig,
  142. });
  143. connection.socket.on("getPush", (data) => {
  144. console.log(
  145. "getPush",
  146. `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}"`
  147. );
  148. });
  149. console.log("connection.client", connection.client);
  150. connection.client.on("peer-join", (event) => {
  151. console.log("peer-join", event);
  152. });
  153. connection.client.on("stream-added", (event) => {
  154. const remoteStream = event.stream;
  155. const remoteUserId = remoteStream.getUserId();
  156. console.warn(
  157. "received a remoteStream ID: " +
  158. remoteStream.getId() +
  159. " from user: " +
  160. remoteUserId
  161. );
  162. // 若需要观看该远端流,则需要订阅它
  163. connection.client.subscribe(remoteStream);
  164. });
  165. // connection.client.on('network-quality', event => {
  166. // console.log(`network-quality, uplinkNetworkQuality:${event.uplinkNetworkQuality}, downlinkNetworkQuality: ${event.downlinkNetworkQuality}`)
  167. // // 自 v4.10.3 支持获取上、下行的 RTT 及丢包率
  168. // console.log(`uplink rtt:${event.uplinkRTT} loss:${event.uplinkLoss}`)
  169. // console.log(`downlink rtt:${event.downlinkRTT} loss:${event.downlinkLoss}`)
  170. // })
  171. connection.client.on("stream-subscribed", (event) => {
  172. const remoteStream = event.stream;
  173. // 远端流订阅成功,在HTML页面中创建一个<video>标签,假设该标签ID为‘remote-video-view’
  174. // 播放该远端流
  175. // console.log("remoteStream", remoteStream);
  176. // remoteStream.resume();
  177. remoteStream.play("testVideoFeed");
  178. const frame = remoteStream.getVideoFrame();
  179. const track = remoteStream.getVideoTrack();
  180. console.warn("frame", frame, track);
  181. console.warn("frame", remoteStream);
  182. });
  183. connection.client.on("error", (event) => {
  184. console.log("error", event);
  185. });
  186. connection.client.on("connection-state-changed", (event) => {
  187. console.warn("connection-state-changed", event);
  188. });
  189. // 监听‘stream-removed’事件
  190. connection.client.on("stream-removed", (event) => {
  191. const remoteStream = event.stream;
  192. console.log(
  193. "remoteStream ID: " +
  194. remoteStream.getId() +
  195. " has been removed"
  196. );
  197. // 停止播放并删除相应<video>标签
  198. });
  199. // 监听‘stream-updated’事件
  200. connection.client.on("stream-updated", (event) => {
  201. const remoteStream = event.stream;
  202. console.warn(
  203. "remoteStream ID: " +
  204. remoteStream.getId() +
  205. " was updated hasAudio: " +
  206. remoteStream.hasAudio() +
  207. " hasVideo: " +
  208. remoteStream.hasVideo()
  209. );
  210. });
  211. // 监听‘stream-subscribed’事件
  212. }
  213. });
  214. });
  215. </script>
  216. </body>
  217. <script src="https://web.sdk.qcloud.com/trtc/webrtc/demo/latest/dist/trtc.js"></script>
  218. </html>
  219. </html>