use-play.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import '@/assets/css/videojs.scss';
  2. import mpegts from 'mpegts.js';
  3. import videoJs from 'video.js';
  4. import Player from 'video.js/dist/types/player';
  5. import { onMounted, onUnmounted, ref, watch } from 'vue';
  6. import { useAppStore } from '@/store/app';
  7. import { createVideo } from '@/utils';
  8. export * as flvJs from 'flv.js';
  9. export function useFlvPlay() {
  10. // const flvPlayer = ref<flvJs.Player>();
  11. const flvPlayer = ref<mpegts.Player>();
  12. const flvVideoEl = ref<HTMLVideoElement>();
  13. const appStore = useAppStore();
  14. onMounted(() => {});
  15. onUnmounted(() => {
  16. destroyFlv();
  17. });
  18. function destroyFlv() {
  19. if (flvPlayer.value) {
  20. console.log(flvPlayer.value.destroy);
  21. flvPlayer.value.destroy();
  22. }
  23. // flvVideoEl.value?.remove();
  24. }
  25. watch(
  26. () => appStore.muted,
  27. (newVal) => {
  28. setMuted(newVal);
  29. }
  30. );
  31. function setMuted(val) {
  32. if (flvPlayer.value) {
  33. flvPlayer.value.muted = val;
  34. }
  35. if (flvVideoEl.value) {
  36. flvVideoEl.value.muted = val;
  37. }
  38. }
  39. function startFlvPlay(data: { flvurl: string }) {
  40. destroyFlv();
  41. return new Promise<{ width: number; height: number }>((resolve) => {
  42. if (mpegts.getFeatureList().mseLivePlayback) {
  43. flvPlayer.value = mpegts.createPlayer({
  44. type: 'flv', // could also be mpegts, m2ts, flv
  45. isLive: true,
  46. url: data.flvurl,
  47. });
  48. const videoEl = createVideo({ muted: true, autoplay: true });
  49. flvVideoEl.value = videoEl;
  50. flvVideoEl.value.addEventListener('play', () => {
  51. console.log('flv-play');
  52. });
  53. flvVideoEl.value.addEventListener('playing', () => {
  54. console.log('flv-playing');
  55. // setMuted(false);
  56. setMuted(appStore.muted);
  57. resolve({
  58. width: flvVideoEl.value?.videoWidth || 0,
  59. height: flvVideoEl.value?.videoHeight || 0,
  60. });
  61. });
  62. flvPlayer.value.attachMediaElement(flvVideoEl.value);
  63. flvPlayer.value.load();
  64. try {
  65. console.log('开始播放flv');
  66. flvPlayer.value.play();
  67. } catch (err) {
  68. console.error('flv播放失败');
  69. console.log(err);
  70. }
  71. } else {
  72. console.error('不支持flv');
  73. }
  74. });
  75. }
  76. return { flvPlayer, flvVideoEl, startFlvPlay, destroyFlv };
  77. }
  78. export function useHlsPlay() {
  79. const hlsPlayer = ref<Player>();
  80. const hlsVideoEl = ref<HTMLVideoElement>();
  81. const appStore = useAppStore();
  82. onMounted(() => {});
  83. onUnmounted(() => {
  84. destroyHls();
  85. });
  86. function destroyHls() {
  87. if (hlsPlayer.value) {
  88. hlsPlayer.value.dispose();
  89. }
  90. hlsVideoEl.value?.remove();
  91. }
  92. function setMuted(val) {
  93. console.log('setMuted', val);
  94. if (hlsVideoEl.value) {
  95. hlsVideoEl.value.muted = val;
  96. }
  97. if (hlsPlayer.value) {
  98. hlsPlayer.value.muted(val);
  99. }
  100. }
  101. watch(
  102. () => appStore.muted,
  103. (newVal) => {
  104. setMuted(newVal);
  105. }
  106. );
  107. function startHlsPlay(data: { hlsurl: string }) {
  108. destroyHls();
  109. const videoEl = createVideo({ muted: appStore.muted, autoplay: true });
  110. hlsVideoEl.value = videoEl;
  111. // document.body.appendChild(videoEl);
  112. return new Promise<{ width: number; height: number }>((resolve) => {
  113. hlsPlayer.value = videoJs(
  114. videoEl,
  115. {
  116. sources: [
  117. {
  118. src: data.hlsurl,
  119. type: 'application/x-mpegURL',
  120. },
  121. ],
  122. },
  123. function () {
  124. console.log('开始播放hls');
  125. hlsPlayer.value?.play();
  126. hlsPlayer.value?.on('play', () => {
  127. console.log('hls-play');
  128. // console.log(hlsPlayer.value?.videoHeight()); // 获取到的是0!
  129. });
  130. hlsPlayer.value?.on('playing', () => {
  131. console.log('hls-playing');
  132. appStore.setMuted(hlsVideoEl.value?.muted || false);
  133. // console.log(hlsPlayer.value?.videoHeight()); // 获取到的是正确的!
  134. const childNodes = hlsPlayer.value?.el().childNodes;
  135. if (childNodes) {
  136. childNodes.forEach((item) => {
  137. if (item.nodeName.toLowerCase() === 'video') {
  138. // @ts-ignore
  139. hlsVideoEl.value = item;
  140. }
  141. });
  142. }
  143. resolve({
  144. width: hlsPlayer.value?.videoWidth() || 0,
  145. height: hlsPlayer.value?.videoHeight() || 0,
  146. });
  147. });
  148. hlsPlayer.value?.on('loadedmetadata', () => {
  149. console.log('hls-loadedmetadata');
  150. });
  151. }
  152. );
  153. });
  154. }
  155. return { hlsPlayer, hlsVideoEl, startHlsPlay, destroyHls };
  156. }