initVideo.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import TCPlayer from 'tcplayer.js';
  2. import 'tcplayer.js/dist/tcplayer.css';
  3. export const _initVideo = (type: string, forms: any, videoRef: any) => {
  4. let player = type === 'one' ? forms.player1 : forms.player2;
  5. // _initVideo('one', forms, forms.player1, videoIntervalRef, forms.introductionVideo, forms.coverImg, forms.player1Speed, forms.videoLoading1)
  6. const videoUrl =
  7. type === 'one' ? forms.introductionVideo : forms.introductionVideo2;
  8. const coverImg = type === 'one' ? forms.coverImg : forms.coverImg2;
  9. let playerSpeed = type === 'one' ? forms.playerSpeed1 : forms.playerSpeed2;
  10. let videoLoading = type === 'one' ? forms.videoLoading1 : forms.videoLoading2;
  11. const videoId = type === 'one' ? 'register-video' : 'register-video2';
  12. const Button = TCPlayer.getComponent('Button');
  13. const BigPlayButton = TCPlayer.getComponent('BigPlayButton');
  14. BigPlayButton.prototype.createEl = function () {
  15. const el = Button.prototype.createEl.call(this);
  16. const _html =
  17. '<button><svg width="50px" height="50px" viewBox="0 0 50 50" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="播放/播放" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><circle id="椭圆形" stroke="#FFFFFF" stroke-width="1.20385619" fill-opacity="0.3" fill="#000000" stroke-linecap="square" cx="25" cy="25" r="24.4114519"></circle><g id="视频/暂停" transform="translate(17.2619, 13.0952)" fill="#FFFFFF"><path d="M12.1943373,5.31370674 L19.8894148,18.3953385 C20.5636212,19.5414893 20.1810346,21.0171804 19.0348838,21.6913868 C18.6648746,21.9090393 18.2434029,22.0238095 17.8141251,22.0238095 L2.42397011,22.0238095 C1.09422728,22.0238095 0.0162577307,20.94584 0.0162577307,19.6160971 C0.0162577307,19.1868194 0.131027981,18.7653477 0.34868043,18.3953385 L8.04375794,5.31370674 C8.71796432,4.1675559 10.1936554,3.78496932 11.3398063,4.4591757 C11.6926653,4.66673986 11.9867731,4.96084767 12.1943373,5.31370674 Z" id="三角形" transform="translate(10.119, 11.9048) rotate(-270) translate(-10.119, -11.9048)"></path></g></g></svg></button>';
  18. el.appendChild(
  19. TCPlayer.dom.createEl('div', {
  20. className: 'vjs-button-icon',
  21. innerHTML: _html
  22. })
  23. );
  24. return el;
  25. };
  26. player = TCPlayer(videoId, {
  27. appID: '',
  28. controls: true,
  29. plugins: {}
  30. }); // player-container-id 为播放器容器 ID,必须与 html 中一致
  31. if (player) {
  32. player.src(videoUrl); // url 播放地址
  33. player.poster(coverImg || '');
  34. // player.on('loadstart', () => {})
  35. player.on('ready', (item: any) => {
  36. console.log('ready', item);
  37. // player.pause()
  38. });
  39. player.on('loadedmetadata', () => {
  40. console.log('loadedmetadata');
  41. videoLoading = false;
  42. if (type === 'one') {
  43. forms.videoLoading1 = false;
  44. } else {
  45. forms.videoLoading2 = false;
  46. }
  47. });
  48. // 速度变化时
  49. player.on('ratechange', () => {
  50. playerSpeed =
  51. playerSpeed < player.playbackRate()
  52. ? player.playbackRate()
  53. : playerSpeed;
  54. });
  55. player.on('seeking', () => {
  56. console.log('seeking');
  57. videoRef.isActive.value && videoRef.pause();
  58. });
  59. // // 拖动结束时
  60. player.on('seeked', () => {
  61. console.log('seeked');
  62. videoRef.isActive.value && videoRef.pause();
  63. });
  64. // 正在搜索中
  65. player.on('waiting', () => {
  66. // console.log('waiting pause')
  67. videoRef.isActive.value && videoRef.pause();
  68. });
  69. // 如何视频在缓存不会触发
  70. player.on('timeupdate', () => {
  71. // console.log('timeupdate', player.currentTime())
  72. // 判断视频计时器是否暂停,如果暂停则恢复
  73. // 添加 「forms.player.playing」 是由会跳转到上次播放时间,会触发些方法
  74. if (
  75. !videoRef.isActive.value &&
  76. player.currentTime() > 0 &&
  77. !player.paused()
  78. ) {
  79. // console.log('timeupdate play')
  80. videoRef.resume();
  81. }
  82. });
  83. // 视屏播放时暂停
  84. player.on('ended', () => {
  85. player.pause();
  86. });
  87. // 开始播放
  88. player.on('play', () => {
  89. // 视频一播放
  90. if (player.id() === 'register-video') {
  91. forms.player2.pause();
  92. }
  93. // 视频二播放
  94. if (player.id() === 'register-video2') {
  95. forms.player1.pause();
  96. }
  97. // console.log('play');
  98. // 判断视频计时器是否暂停,如果暂停则恢复
  99. videoRef.resume();
  100. });
  101. // 暂停播放
  102. player.on('pause', () => {
  103. // console.log('pause', videoRef.isActive.value);
  104. videoRef.pause();
  105. });
  106. let isFullscreen = false;
  107. player.on('fullscreenchange', () => {
  108. console.log('fullscreen fullscreenchange', player.isFullscreen());
  109. // if (player.isFullscreen()) {
  110. if (isFullscreen) {
  111. isFullscreen = false;
  112. const i = document.getElementById('fullscreen-back');
  113. i && i.remove();
  114. } else {
  115. isFullscreen = true;
  116. const i = document.createElement('i');
  117. i.id = 'fullscreen-back';
  118. i.className = 'van-icon van-icon-arrow-left video-back';
  119. i.addEventListener('click', () => {
  120. player.exitFullscreen();
  121. });
  122. document.getElementById(videoId)?.appendChild(i);
  123. }
  124. // } else {
  125. // const i = document.getElementById('fullscreen-back');
  126. // i && i.remove();
  127. // }
  128. });
  129. return player;
  130. }
  131. };