index.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. import { uuid } from "./webrtc/uuid.js";
  123. document.addEventListener("DOMContentLoaded", async () => {
  124. const connection = new Connection();
  125. window.connection = connection;
  126. const testConfig = {
  127. userId: uuid(16, 16),
  128. roomId: "22s1111ss",
  129. sdkAppId: 1400653314,
  130. sceneCode: "2111",
  131. };
  132. console.log("testConfig", testConfig);
  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.on("init-scene", {
  138. // videos: ["0/0_1_0", "1/0_2_0"],
  139. // range: [start, end],
  140. // isRotate: true,
  141. // });
  142. connection.socket.emit("getPush", {
  143. userId: testConfig.userId,
  144. roomId: testConfig.roomId,
  145. sceneCode: testConfig.sceneCode,
  146. userSig: connection.userSig,
  147. });
  148. connection.socket.on("getPush", (data) => {
  149. console.log(
  150. "getPush",
  151. `ffmpeg -loglevel info -re -stream_loop -1 -i output.mp4 -c:v libx264 -preset fast -profile:v baseline -g 30 -sc_threshold 0 -b:v 1500k -f flv "${data}"`
  152. );
  153. });
  154. connection.socket.emit("init-webrtc");
  155. console.log("connection.client", connection.client);
  156. connection.client.on("peer-join", (event) => {
  157. console.log("peer-join", event);
  158. });
  159. connection.client.on("client-banned", () => {
  160. location.reload();
  161. });
  162. connection.client.on("stream-added", (event) => {
  163. const remoteStream = event.stream;
  164. const remoteUserId = remoteStream.getUserId();
  165. console.warn("stream-added", remoteStream);
  166. console.warn(
  167. "received a remoteStream ID: " +
  168. remoteStream.getId() +
  169. " from user: " +
  170. remoteUserId
  171. );
  172. // 若需要观看该远端流,则需要订阅它
  173. connection.client.subscribe(remoteStream);
  174. });
  175. // connection.client.on('network-quality', event => {
  176. // console.log(`network-quality, uplinkNetworkQuality:${event.uplinkNetworkQuality}, downlinkNetworkQuality: ${event.downlinkNetworkQuality}`)
  177. // // 自 v4.10.3 支持获取上、下行的 RTT 及丢包率
  178. // console.log(`uplink rtt:${event.uplinkRTT} loss:${event.uplinkLoss}`)
  179. // console.log(`downlink rtt:${event.downlinkRTT} loss:${event.downlinkLoss}`)
  180. // })
  181. connection.client.on("stream-subscribed", (event) => {
  182. const remoteStream = event.stream;
  183. // 远端流订阅成功,在HTML页面中创建一个<video>标签,假设该标签ID为‘remote-video-view’
  184. // 播放该远端流
  185. // console.log("remoteStream", remoteStream);
  186. // remoteStream.resume();
  187. remoteStream.play("testVideoFeed");
  188. const frame = remoteStream.getVideoFrame();
  189. const track = remoteStream.getVideoTrack();
  190. console.warn("frame", frame, track);
  191. console.warn("frame", remoteStream);
  192. });
  193. connection.client.on("error", (event) => {
  194. console.log("error", event);
  195. });
  196. connection.client.on("connection-state-changed", (event) => {
  197. console.warn("connection-state-changed", event);
  198. });
  199. // 监听‘stream-removed’事件
  200. connection.client.on("stream-removed", (event) => {
  201. const remoteStream = event.stream;
  202. console.log(
  203. "remoteStream ID: " +
  204. remoteStream.getId() +
  205. " has been removed"
  206. );
  207. // 停止播放并删除相应<video>标签
  208. });
  209. // 监听‘stream-updated’事件
  210. connection.client.on("stream-updated", (event) => {
  211. const remoteStream = event.stream;
  212. console.warn(
  213. "remoteStream ID: " +
  214. remoteStream.getId() +
  215. " was updated hasAudio: " +
  216. remoteStream.hasAudio() +
  217. " hasVideo: " +
  218. remoteStream.hasVideo()
  219. );
  220. });
  221. // 监听‘stream-subscribed’事件
  222. }
  223. });
  224. });
  225. </script>
  226. </body>
  227. <script src="https://web.sdk.qcloud.com/trtc/webrtc/demo/latest/dist/trtc.js"></script>
  228. </html>
  229. </html>
  230. ffmpeg -i 'rtmp://127.0.0.1/live?B1wrZUZQc' -i
  231. 'http://120.24.252.95:8080/live/livestream.flv' -filter_complex overlay -c:v
  232. libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p -f
  233. flv
  234. "rtmp://rtmp.rtc.qq.com/push/22s1111ss?sdkappid=1400653314&userid=007E83817D55C01F&usersig=eJw1jsEKgkAURf9l1iFvnHF8CK3UaBFUaGFLYUZ5ijLaoEH074nW8p7Dgftm*SnzzMvSaFikQCLAbmWTGVnEfA-Ytp*6La0lzSIuAVQgBJebIW16RxWtAUCYokAeJkEQAz-8a6oXWVzaeh6HfO6mFl2ZNnOvlZvO13CQVWl4o*OuuD9Udrztf6GjbjnGlUQlBaL-*QLFzTO7"