Jessibuca是一款开源的纯H5直播流播放器,通过Emscripten将音视频解码库编译成Js(ams.js/wasm)运行于浏览器之中。兼容几乎所有浏览器,可以运行在PC、手机、微信中,无需额外安装插件。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.8 KiB

6 years ago
6 years ago
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>H5LiveClient 1.0</title>
  6. <meta charset="utf-8" />
  7. <style>
  8. .btn {
  9. display: inline-block;
  10. line-height: 1;
  11. white-space: nowrap;
  12. cursor: pointer;
  13. -webkit-appearance: none;
  14. text-align: center;
  15. box-sizing: border-box;
  16. outline: none;
  17. margin: 0;
  18. transition: .1s;
  19. font-weight: 500;
  20. -moz-user-select: none;
  21. -webkit-user-select: none;
  22. -ms-user-select: none;
  23. padding: 12px 20px;
  24. font-size: 14px;
  25. border-radius: 4px;
  26. color: #fff;
  27. background-color: #409eff;
  28. border-color: #409eff;
  29. width: 100%;
  30. }
  31. .btn-danger {
  32. color: #fff;
  33. background-color: #f56c6c;
  34. border-color: #f56c6c;
  35. }
  36. .btn-success {
  37. color: #fff;
  38. background-color: #67c23a;
  39. border-color: #67c23a;
  40. }
  41. .player-wrapper {
  42. width: 900px;
  43. height: 500px;
  44. /*overflow-y: auto;*/
  45. margin: 0 auto;
  46. text-align: center;
  47. }
  48. .btn-wrapper {
  49. width: 900px;
  50. height: 50px;
  51. margin: 0 auto;
  52. margin-top: 10px;
  53. }
  54. .player-wrapper canvas {
  55. width: 100%;
  56. height: 100%;
  57. }
  58. .logs {
  59. border: 1px solid #333;
  60. width: 900px;
  61. height: 300px;
  62. margin: 0 auto;
  63. overflow-y: auto;
  64. padding: 5px;
  65. }
  66. </style>
  67. </head>
  68. <body>
  69. <div class="player-wrapper">
  70. <canvas id="canvas" style="background-color: #0D0E1B"></canvas>
  71. </div>
  72. <div class="btn-wrapper">
  73. <div id="playDom">
  74. <button class="btn" id="play">播放</button>
  75. </div>
  76. <div id="stopDom" style="display: none">
  77. <button class="btn btn-danger" id="stop">结束</button>
  78. </div>
  79. </div>
  80. <div id="logout" class="logs">
  81. </div>
  82. <script src="./ajax.js"></script>
  83. <script>
  84. onerror = handleErr;
  85. var txt = "";
  86. var h5lc = null;
  87. var $play = document.getElementById('play');
  88. var $stop = document.getElementById('stop');
  89. var $playDom = document.getElementById('playDom');
  90. var $stopDom = document.getElementById('stopDom');
  91. var canvas = document.getElementById("canvas");
  92. var isPlaying = false;
  93. disabledMouseWheel(canvas);
  94. $play.addEventListener('click', function () {
  95. if (isPlaying) {
  96. return;
  97. }
  98. isPlaying = true;
  99. play();
  100. $playDom.style.display = 'none';
  101. $stopDom.style.display = 'block';
  102. });
  103. $stop.addEventListener('click', function () {
  104. if (!isPlaying) {
  105. return;
  106. }
  107. isPlaying = false;
  108. stop();
  109. $playDom.style.display = 'block';
  110. $stopDom.style.display = 'none';
  111. });
  112. function play() {
  113. h5lc.play("ws://3.1.39.135:8080/live/345.flv", canvas)
  114. // h5lc.play("ws://localhost:8080/live/user1", canvas)
  115. // h5lc.play("ws://119.9.118.39:8080/live/user1", canvas)
  116. // h5lc.play("ws://test.qihaipi.com/gnddragon/test.flv", canvas)
  117. }
  118. function stop() {
  119. h5lc.close()
  120. }
  121. function disabledMouseWheel(ele) {
  122. if (ele.addEventListener) {
  123. ele.addEventListener('DOMMouseScroll', scrollFunc, false);
  124. } //W3C
  125. ele.onmousewheel = scrollFunc; //IE/Opera/Chrome
  126. }
  127. function scrollFunc(evt) {
  128. evt = evt || window.event;
  129. if (evt.preventDefault) {
  130. // Firefox
  131. evt.preventDefault();
  132. evt.stopPropagation();
  133. } else {
  134. // IE
  135. evt.cancelBubble = true;
  136. evt.returnValue = false;
  137. }
  138. return false;
  139. }
  140. function handleErr(msg, url, l) {
  141. txt = "There was an error on this page.\n\n";
  142. txt += "Error: " + msg + "\n";
  143. txt += "URL: " + url + "\n";
  144. txt += "Line: " + l + "\n\n";
  145. document.getElementById("logout").innerHTML += txt + "<br>";
  146. return true;
  147. }
  148. var Module = {
  149. print: (function () {
  150. return function (text) {
  151. if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
  152. document.getElementById("logout").innerHTML += text + "<br>";
  153. // These replacements are necessary if you render to raw HTML
  154. //text = text.replace(/&/g, "&amp;");
  155. //text = text.replace(/</g, "&lt;");
  156. //text = text.replace(/>/g, "&gt;");
  157. //text = text.replace('\n', '<br>', 'g');
  158. console.log(text);
  159. };
  160. })(),
  161. printErr: function (text) {
  162. if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
  163. document.getElementById("logout").innerHTML += text + "<br>";
  164. if (0) { // XXX disabled for safety typeof dump == 'function') {
  165. dump(text + '\n'); // fast, straight to the real console
  166. } else {
  167. console.error(text);
  168. }
  169. },
  170. postRun: function () {
  171. h5lc = new H5LiveClient();
  172. h5lc.videoBuffer = 1;
  173. }
  174. };
  175. </script>
  176. <script src="./hevc_aac.js"></script>
  177. </body>
  178. </html>