player.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <!-- Copyright Epic Games, Inc. All Rights Reserved. -->
  2. <!DOCTYPE HTML>
  3. <html>
  4. <head>
  5. <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
  6. <link rel="icon" type="image/png" sizes="96x96" href="/images/favicon-96x96.png">
  7. <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
  8. <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
  9. <link rel="preconnect" href="https://fonts.googleapis.com">
  10. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  11. <link href="https://fonts.googleapis.com/css2?family=Michroma&family=Montserrat:wght@600&display=swap" rel="stylesheet">
  12. <link type="text/css" rel="stylesheet" href="player.css">
  13. <script type="text/javascript">
  14. // This horrible hack is to make Fippo's adapter-latest.js work with Firefox when not on https
  15. // because FF does not let you access navigator.mediaDevices when on http.
  16. var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
  17. if (isFirefox) {
  18. window.navigator.mozGetUserMedia = function () { };
  19. if (window.navigator.mediaDevices === undefined) {
  20. navigator.mediaDevices = {};
  21. navigator.mediaDevices.getSupportedConstraints = function () { return {}; };
  22. navigator.mediaDevices.getUserMedia = function () { return {}; };
  23. }
  24. }
  25. </script>
  26. <script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
  27. <script type="text/javascript" src="scripts/webRtcPlayer.js"></script>
  28. <script type="text/javascript" src="scripts/app.js"></script>
  29. </head>
  30. <body onload="load()">
  31. <div id="playerUI" class="noselect">
  32. <div id="player"></div>
  33. <div id="overlay">
  34. <div id="controls">
  35. <button class="tooltip" onclick="fullscreen()" id="fullscreen-btn">
  36. <object data="images/Minimize.svg" type="image/svg+xml" id="minimize"></object>
  37. <object data="images/Maximize.svg" type="image/svg+xml" id="maximize"></object>
  38. <span class="tooltiptext">Fullscreen</span>
  39. </button>
  40. <button class="tooltip" id="settingsBtn">
  41. <object data="images/Settings.svg" type="image/svg+xml"></object>
  42. <span class="tooltiptext">Settings</span>
  43. </button>
  44. <button class="tooltip" id="statsBtn">
  45. <object data="images/Info.svg" type="image/svg+xml"></object>
  46. <span class="tooltiptext">Information</span>
  47. </button>
  48. </div>
  49. <div id="unrealengine">
  50. <p></p>
  51. <svg viewBox="0 0 1204.105 74.011" xmlns="http://www.w3.org/2000/svg">
  52. <g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="9pt" stroke="#ffffff" stroke-width="0.25mm" fill="#ffffff" style="stroke:#ffffff;stroke-width:0.25mm;fill:#ffffff">
  53. <path d="M 894.605 74.006 L 921.305 74.006 C 942.427 74.006 953.413 73.292 956.313 60.527 A 37.848 37.848 0 0 0 957.105 52.206 L 957.105 31.606 L 907.305 31.606 L 907.305 46.606 L 934.905 46.606 L 934.905 48.706 C 934.905 53.442 932.251 55.385 928.738 56.147 A 26.156 26.156 0 0 1 923.305 56.606 L 899.605 56.606 A 39.408 39.408 0 0 1 894.638 56.344 C 888.593 55.565 886.231 52.853 885.654 45.747 A 52.88 52.88 0 0 1 885.505 41.506 L 885.505 32.506 A 48.028 48.028 0 0 1 885.738 27.377 C 886.556 19.865 889.695 17.689 897.793 17.433 A 57.321 57.321 0 0 1 899.605 17.406 L 923.705 17.406 A 38.323 38.323 0 0 1 927.889 17.588 C 932.328 18.085 934.835 19.818 934.904 25.273 A 18.461 18.461 0 0 1 934.905 25.506 L 956.705 25.506 L 956.705 23.206 A 36.235 36.235 0 0 0 955.47 12.587 C 953.178 5.214 946.987 0.624 931.363 0.064 A 93.813 93.813 0 0 0 928.005 0.006 L 894.605 0.006 C 874.839 0.006 862.985 4.89 862.71 25.469 A 55.259 55.259 0 0 0 862.705 26.206 L 862.705 47.806 A 39.6 39.6 0 0 0 863.741 57.358 C 866.906 70.059 877.192 73.722 892.685 73.99 A 111.289 111.289 0 0 0 894.605 74.006 Z M 323.405 73.206 L 403.905 73.206 L 403.905 55.806 L 345.605 55.806 L 345.605 44.206 L 399.605 44.206 L 399.605 29.206 L 345.605 29.206 L 345.605 17.606 L 402.605 17.606 L 402.605 0.806 L 323.405 0.806 L 323.405 73.206 Z M 656.905 73.206 L 737.405 73.206 L 737.405 55.806 L 679.105 55.806 L 679.105 44.206 L 733.105 44.206 L 733.105 29.206 L 679.105 29.206 L 679.105 17.606 L 736.105 17.606 L 736.105 0.806 L 656.905 0.806 L 656.905 73.206 Z M 1123.605 73.206 L 1204.105 73.206 L 1204.105 55.806 L 1145.805 55.806 L 1145.805 44.206 L 1199.805 44.206 L 1199.805 29.206 L 1145.805 29.206 L 1145.805 17.606 L 1202.805 17.606 L 1202.805 0.806 L 1123.605 0.806 L 1123.605 73.206 Z M 106.205 73.206 L 128.405 73.206 L 128.405 20.606 L 128.605 20.606 L 170.305 73.206 L 204.705 73.206 L 204.705 0.806 L 182.505 0.806 L 182.505 53.406 L 182.305 53.406 L 140.605 0.806 L 106.205 0.806 L 106.205 73.206 Z M 750.805 73.206 L 773.005 73.206 L 773.005 20.606 L 773.205 20.606 L 814.905 73.206 L 849.305 73.206 L 849.305 0.806 L 827.105 0.806 L 827.105 53.406 L 826.905 53.406 L 785.205 0.806 L 750.805 0.806 L 750.805 73.206 Z M 1010.105 73.206 L 1032.305 73.206 L 1032.305 20.606 L 1032.505 20.606 L 1074.205 73.206 L 1108.605 73.206 L 1108.605 0.806 L 1086.405 0.806 L 1086.405 53.406 L 1086.205 53.406 L 1044.505 0.806 L 1010.105 0.806 L 1010.105 73.206 Z M 29.705 74.006 L 61.505 74.006 A 51.732 51.732 0 0 0 72.484 72.955 C 82.691 70.728 88.531 64.939 90.473 55.381 A 40.134 40.134 0 0 0 91.205 47.406 L 91.205 0.806 L 69.005 0.806 L 69.005 42.606 C 69.005 51.405 65.987 55.082 57.762 55.385 A 31.364 31.364 0 0 1 56.605 55.406 L 34.605 55.406 A 22.943 22.943 0 0 1 30.082 55.013 C 24.736 53.93 22.488 50.538 22.231 43.95 A 34.441 34.441 0 0 1 22.205 42.606 L 22.205 0.806 L 0.005 0.806 L 0.005 47.406 C 0.005 64.841 8.73 73.457 27.816 73.981 A 68.853 68.853 0 0 0 29.705 74.006 Z M 219.705 73.206 L 241.905 73.206 L 241.905 54.406 L 276.805 54.406 A 18.122 18.122 0 0 1 280.084 54.663 C 284.425 55.469 285.905 58.272 285.905 64.506 L 285.905 73.206 L 308.105 73.206 L 308.105 60.906 C 308.105 49.006 302.605 46.106 296.005 44.906 L 296.005 44.706 A 22.978 22.978 0 0 0 300.937 43.003 C 305.503 40.745 307.44 37.183 308.108 32.151 A 40.124 40.124 0 0 0 308.405 26.906 L 308.405 22.306 A 33.46 33.46 0 0 0 307.248 12.853 C 305.018 5.341 299.196 0.806 286.705 0.806 L 219.705 0.806 L 219.705 73.206 Z M 410.205 73.206 L 435.005 73.206 L 441.505 60.406 L 486.505 60.406 L 493.405 73.206 L 518.105 73.206 L 478.305 0.806 L 449.405 0.806 L 410.205 73.206 Z M 526.005 73.206 L 598.105 73.206 L 598.105 54.606 L 548.205 54.606 L 548.205 0.806 L 526.005 0.806 L 526.005 73.206 Z M 971.705 73.206 L 993.905 73.206 L 993.905 0.806 L 971.705 0.806 L 971.705 73.206 Z M 241.905 18.806 L 276.605 18.806 A 34.237 34.237 0 0 1 280.146 18.959 C 283.795 19.344 285.876 20.558 286.556 23.711 A 12.861 12.861 0 0 1 286.805 26.406 L 286.805 28.806 A 12.128 12.128 0 0 1 286.485 31.774 C 285.685 34.926 283.316 36.406 278.605 36.406 L 241.905 36.406 L 241.905 18.806 Z M 463.805 17.606 L 478.205 44.806 L 449.805 44.806 L 463.805 17.606 Z"/>
  54. </g>
  55. </svg>
  56. </div>
  57. <div id="connection" class="tooltip">
  58. <svg version="1.1" id="connectionStrength" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  59. viewBox="0 0 494.45 494.45" style="enable-background:new 0 0 494.45 494.45;" xml:space="preserve">
  60. <circle id="dot" cx="247.125" cy="398.925" r="35.3"/>
  61. <path id="middle" d="M395.225,277.325c-6.8,0-13.5-2.6-18.7-7.8c-71.4-71.3-187.4-71.3-258.8,0c-10.3,10.3-27.1,10.3-37.4,0
  62. s-10.3-27.1,0-37.4c92-92,241.6-92,333.6,0c10.3,10.3,10.3,27.1,0,37.4C408.725,274.725,401.925,277.325,395.225,277.325z"/>
  63. <path id="outer" d="M467.925,204.625c-6.8,0-13.5-2.6-18.7-7.8c-111.5-111.4-292.7-111.4-404.1,0c-10.3,10.3-27.1,10.3-37.4,0
  64. s-10.3-27.1,0-37.4c64-64,149-99.2,239.5-99.2s175.5,35.2,239.5,99.2c10.3,10.3,10.3,27.1,0,37.4
  65. C481.425,202.025,474.625,204.625,467.925,204.625z"/>
  66. <path id="inner" d="M323.625,348.825c-6.8,0-13.5-2.6-18.7-7.8c-15.4-15.4-36-23.9-57.8-23.9s-42.4,8.5-57.8,23.9
  67. c-10.3,10.3-27.1,10.3-37.4,0c-10.3-10.3-10.3-27.1,0-37.4c25.4-25.4,59.2-39.4,95.2-39.4s69.8,14,95.2,39.5
  68. c10.3,10.3,10.3,27.1,0,37.4C337.225,346.225,330.425,348.825,323.625,348.825z"/>
  69. </svg>
  70. <span class="tooltiptext" id="qualityText">Not connected</span>
  71. </div>
  72. <div class="panel-wrap" id="settings-panel">
  73. <div class="panel">
  74. <div id="heading">Settings</div>
  75. <div id="close" onclick="settingsClicked()"></div>
  76. <div id="content">
  77. <div id="fillWindow" class="setting">
  78. <div class="settings-text">Enlarge display to fill window</div>
  79. <label class="tgl-switch">
  80. <input type="checkbox" id="enlarge-display-to-fill-window-tgl" class="tgl tgl-flat" checked>
  81. <div class="tgl-slider"></div>
  82. </label>
  83. </div>
  84. <div id="qualityControlOwnership" class="setting">
  85. <div class="settings-text">Is quality controller?</div>
  86. <label class="tgl-switch">
  87. <input type="checkbox" id="quality-control-ownership-tgl" class="tgl tgl-flat">
  88. <div class="tgl-slider"></div>
  89. </label>
  90. </div>
  91. <div id="matchViewportResolution" class="setting">
  92. <div class="settings-text">Match viewport resolution</div>
  93. <label class="tgl-switch">
  94. <input type="checkbox" id="match-viewport-res-tgl" class="tgl tgl-flat">
  95. <div class="tgl-slider"></div>
  96. </label>
  97. </div>
  98. <div id="offerToReceive" class="setting">
  99. <div class="settings-text">Offer To Receive</div>
  100. <label class="tgl-switch">
  101. <input type="checkbox" id="offer-receive-tgl" class="tgl tgl-flat">
  102. <div class="tgl-slider"></div>
  103. </label>
  104. </div>
  105. <div id="preferSFU" class="setting">
  106. <div class="settings-text">Prefer SFU</div>
  107. <label class="tgl-switch">
  108. <input type="checkbox" id="prefer-sfu-tgl" class="tgl tgl-flat">
  109. <div class="tgl-slider"></div>
  110. </label>
  111. </div>
  112. <div id="useMic" class="setting">
  113. <div class="settings-text">Use microphone</div>
  114. <label class="tgl-switch">
  115. <input type="checkbox" id="use-mic-tgl" class="tgl tgl-flat">
  116. <div class="tgl-slider"></div>
  117. </label>
  118. </div>
  119. <div id="forceMonoAudio" class="setting">
  120. <div class="settings-text">Force mono audio</div>
  121. <label class="tgl-switch">
  122. <input type="checkbox" id="force-mono-tgl" class="tgl tgl-flat">
  123. <div class="tgl-slider"></div>
  124. </label>
  125. </div>
  126. <div id="forceTURN" class="setting">
  127. <div class="settings-text">Force TURN</div>
  128. <label class="tgl-switch">
  129. <input type="checkbox" id="force-turn-tgl" class="tgl tgl-flat">
  130. <div class="tgl-slider"></div>
  131. </label>
  132. </div>
  133. <div id="toggleControl" class="setting">
  134. <div class="settings-text" id="control-scheme-text">Control Scheme</div>
  135. <label class="btn-overlay">
  136. <label class="tgl-switch">
  137. <input type="checkbox" id="control-tgl" class="tgl tgl-flat">
  138. <div class="tgl-slider"></div>
  139. </label>
  140. </label>
  141. </div>
  142. <div id="toggleCursor" class="setting">
  143. <div class="settings-text" id="cursor-text">Hide Browser Cursor</div>
  144. <label class="btn-overlay">
  145. <label class="tgl-switch">
  146. <input type="checkbox" id="cursor-tgl" class="tgl tgl-flat">
  147. <div class="tgl-slider"></div>
  148. </label>
  149. </label>
  150. </div>
  151. <div id="showFPS" class="setting">
  152. <div class="settings-text">Show FPS</div>
  153. <label class="btn-overlay">
  154. <input type="button" id="show-fps-button" class="overlay-button btn-flat" value="Toggle">
  155. </label>
  156. </div>
  157. <div id="keyframeRequest" class="setting">
  158. <div class="settings-text">Request KeyFrame</div>
  159. <label class="btn-overlay">
  160. <input type="button" id="request-keyframe-button" class="overlay-button btn-flat" value="Request">
  161. </label>
  162. </div>
  163. <section id="encoderSettings">
  164. <div id="encoderSettingsHeader" class="settings-text">
  165. <div>Encoder Settings</div>
  166. </div>
  167. <div id="encoderParamsContainer" class="collapse">
  168. <div class="form-group">
  169. <label for="encoder-min-qp-text">Min QP</label>
  170. <input type="number" class="form-control" id="encoder-min-qp-text" value="0" min="0"
  171. max="51" />
  172. <label for="encoder-max-qp-text">Max QP</label>
  173. <input type="number" class="form-control" id="encoder-max-qp-text" value="51" min="0"
  174. max="51" />
  175. <br>
  176. <input id="encoder-params-submit" class="overlay-button btn-flat" type="button"
  177. value="Apply">
  178. </div>
  179. </div>
  180. </section>
  181. <section id="webRTCSettings">
  182. <div id="webRTCSettingsHeader" class="settings-text">
  183. <div>WebRTC Settings</div>
  184. </div>
  185. <div id="webrtcParamsContainer" class="collapse">
  186. <div class="form-group">
  187. <label for="webrtc-fps-text">FPS</label>
  188. <input type="number" class="form-control" id="webrtc-fps-text" value="60" min="1"
  189. max="999" />
  190. <label for="webrtc-min-bitrate-text">Min bitrate (kbps)</label>
  191. <input type="number" class="form-control" id="webrtc-min-bitrate-text" value="0" min="0"
  192. max="100000" />
  193. <label for="webrtc-max-bitrate-text">Max bitrate (kbps)</label>
  194. <input type="number" class="form-control" id="webrtc-max-bitrate-text" value="0" min="0"
  195. max="100000" />
  196. <br>
  197. <input id="webrtc-params-submit" class="overlay-button btn-flat" type="button"
  198. value="Apply">
  199. </div>
  200. </div>
  201. </section>
  202. <section id="streamSettings">
  203. <div id="streamSettingsHeader" class="settings-text">
  204. <div>Stream Settings</div>
  205. </div>
  206. <div id="streamSettingsContainer" class="collapse">
  207. <div class="form-group">
  208. <div class="settings-text">Player stream</div>
  209. <select class="form-control" id="stream-select"></select>
  210. <div class="settings-text">Player track</div>
  211. <select class="form-control" id="track-select"></select>
  212. </div>
  213. </div>
  214. </section>
  215. <br>
  216. <section id="connectionSettings">
  217. <div id="connectionHeader" class="settings-text">
  218. <div>Stream Settings</div>
  219. </div>
  220. <div id="connectionContainer" class="collapse">
  221. <div class="setting">
  222. <div class="settings-text"></div>
  223. <label class="btn-overlay">
  224. <input type="button" id="restart-stream-button" class="overlay-button btn-flat" value="Restart stream">
  225. </label>
  226. </div>
  227. </div>
  228. </section>
  229. </div>
  230. </div>
  231. </div>
  232. <div class="panel-wrap" id="stats-panel">
  233. <div class="panel">
  234. <div id="heading">Information</div>
  235. <div id="close" onclick="statsClicked()"></div>
  236. <div id="content">
  237. <section id="statsPanel">
  238. <div class="setting settings-text">
  239. <div>Session Stats</div>
  240. </div>
  241. <div id="statsContainer" class="statsContainer">
  242. <div id="stats" class="stats"></div>
  243. </div>
  244. </section>
  245. <br>
  246. <section id="latencyTest">
  247. <div class="setting">
  248. <div class="settings-text">
  249. <div>Latency Report</div>
  250. </div>
  251. <label class="btn-overlay">
  252. <input type="button" id="test-latency-button" class="overlay-button btn-flat"
  253. value="Get Report">
  254. </label>
  255. </div>
  256. <div id="latencyStatsContainer" class="statsContainer">
  257. <div id=LatencyStats class="stats">No report yet</div>
  258. </div>
  259. </section>
  260. </div>
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. </body>
  266. </html>