p2phls.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <meta charset="UTF-8">
  2. <style type="text/css">
  3. body,html{width:100%;height:100%;background:#000;padding:0;margin:0;overflow-x:hidden;overflow-y:hidden}
  4. *{margin:0;border:0;padding:0;text-decoration:none}
  5. #video {
  6. position:inherit;
  7. }
  8. .total {position: absolute;top: 1px;left: 10px;color: #fff;font-size: 13px;}
  9. /* 移动设备自适应宽高 */
  10. @media only screen and (max-width: 650px) {
  11. #list {
  12. width: 100%;
  13. left: 0px;
  14. max-width: 100%;
  15. min-width: auto;
  16. }
  17. #video {
  18. height: 100% !important;
  19. width: 100% !important;
  20. }
  21. .total {position: absolute;top: 0px;left: 10px;color: #fff;font-size: 12px;}
  22. }
  23. #time {
  24. display: none;
  25. right: 10px;
  26. text-align: center;
  27. top: 3px;
  28. font-size: 12px;
  29. color: #fdfdfd;
  30. text-shadow: 1px 1px 1px #000, 1px 1px 1px #000;
  31. position: fixed;
  32. z-index: 2147483645;
  33. }
  34. .masked h4{
  35. display: block;
  36. /*渐变背景*/
  37. background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,
  38. #ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);
  39. color: transparent; /*文字填充色为透明*/
  40. -webkit-text-fill-color: transparent;
  41. -webkit-background-clip: text; /*背景剪裁为文字,只将文字显示为背景*/
  42. background-size: 200% 100%; /*背景图片向水平方向扩大一倍,这样background-position才有移动与变化的空间*/
  43. /* 动画 */
  44. animation: masked-animation 4s infinite linear;
  45. }
  46. @keyframes masked-animation {
  47. 0% {
  48. background-position: 0 0; /*background-position 属性设置背景图像的起始位置。*/
  49. }
  50. 100% {
  51. background-position: -100% 0;
  52. }
  53. }
  54. </style>
  55. <div id="video"></div>
  56. <div class="total">
  57. <div class="masked">
  58. <h4><div id="stats"></div></h4>
  59. </div>
  60. </div>
  61. <script src="/web/player/p2phls/hls.min.js"></script>
  62. <script src="/web/player/p2phls/cbplayer2.js"></script>
  63. <script src="/web/player/p2phls/jquery.min.js"></script>
  64. <script>
  65. var _peerId = '', _peerNum = 0, _totalP2PDownloaded = 0, _totalP2PUploaded = 0;
  66. var m3u8url = document.location.href.split("url=")[1];
  67. var player = new CBPlayer({
  68. container: document.getElementById('video'),
  69. autoplay: true, //视频自动播放
  70. live: false, //开启直播模式
  71. lang: 'zh-cn', //语言
  72. hotkey: true, //开启热键,支持快进、快退、音量控制、播放暂停
  73. airplay: true, //在 Safari 中开启 AirPlay
  74. screenshot: false, //开启截图,如果开启,视频和视频封面需要允许跨域
  75. preload: 'auto', //视频预加载,可选值: 'none', 'metadata', 'auto'
  76. danmaku: true,
  77. video: {
  78. pic: "/web/player/p2phls/loading_pc.jpg",
  79. url: m3u8url||'https://vip.ffzyread1.com/20230601/13234_55ed2d56/index.m3u8',
  80. },
  81. pluginOptions: {
  82. hls: {
  83. //maxBufferSize: 0,
  84. //maxBufferLength: 10,
  85. //liveSyncDurationCount: 15,
  86. p2pConfig: {
  87. // logLevel: true,
  88. live: false,
  89. geoIpPreflight: false, //向在线IP数据库请求ASN等信息,从而获得更准确的调度,会延迟P2P启动时间。
  90. useHttpRange: false, //用于补足p2p下载超时的剩余部分数据
  91. sharePlaylist: true, //是否允许m3u8文件的P2P传输。
  92. diskCacheLimit: {"pc": 2500 * 1024 * 1024, "mobile": 1500 * 1024 * 1024}, //磁盘缓存的最大数据量,分为PC和mobile。
  93. memoryCacheLimit: {"pc": 600 * 1024 * 1024, "mobile": 300 * 1024 * 1024}, //内存缓存的最大数据量,分为PC和mobile。
  94. announce: "https://p2ptrakcer.bapy.top",
  95. wsSignalerAddr: 'wss://cd.swarmcloud.net',
  96. },
  97. webRTCConfig: {
  98. iceServers: [{
  99. urls: "stun:stun.l.google.com:19302"
  100. }, {
  101. urls: "stun:global.stun.twilio.com:3478?transport=udp"
  102. }, {
  103. urls: "stun:stun.cdnbye.com"
  104. }]
  105. }
  106. }
  107. },
  108. danmaku: {
  109. id: m3u8url||'https://vip.ffzyread1.com/20230601/13234_55ed2d56/index.m3u8',
  110. api: 'https://danmu.aip520.cn/v3/?id='
  111. }
  112. });
  113. player.on('stats', function (stats) {
  114. _totalP2PDownloaded = stats.totalP2PDownloaded;
  115. _totalP2PUploaded = stats.totalP2PUploaded;
  116. updateStats();
  117. })
  118. player.on('peerId', function (peerId) {
  119. _peerId = peerId;
  120. })
  121. player.on('peers', function (peers) {
  122. _peerNum = peers.length;
  123. updateStats();
  124. });
  125. //全屏
  126. player.on("fullscreen", function() {
  127. $("#time").show();
  128. });
  129. //退出全屏
  130. player.on("fullscreen_cancel", function() {
  131. $("#time").hide();
  132. });
  133. //移动浏览器video兼容
  134. $('body').find('video')
  135. .attr('playsinline', '')
  136. .attr('x5-playsinline', '')
  137. .attr('webkit-playsinline', '')
  138. .attr('x-webkit-airplay', 'allow')
  139. function updateStats() {
  140. var text = 'P2P开启 加速' + (_totalP2PDownloaded/1024).toFixed(2)
  141. + 'MB 分享' + (_totalP2PUploaded/1024).toFixed(2) + 'MB' + ' 连接节点' + _peerNum + '个';
  142. document.getElementById('stats').innerText = text
  143. }
  144. //时间更新
  145. function timeUpdate() {
  146. var date = new Date();
  147. var year = date.getFullYear();
  148. var month = date.getMonth() + 1;
  149. var day = date.getDate();
  150. var hour = "00" + date.getHours();
  151. hour = hour.substr(hour.length - 2);
  152. var minute = "00" + date.getMinutes();
  153. minute = minute.substr(minute.length - 2);
  154. var second = "00" + date.getSeconds();
  155. second = second.substr(second.length - 2);
  156. $("#time").html(hour + ":" + minute + ":" + second);
  157. setTimeout("timeUpdate()", 1000);
  158. }
  159. //信息控件
  160. if (!$('#time').length) {$("#video").append("<div id='time'></div>");}
  161. //显示时间
  162. timeUpdate();
  163. </script>