当前位置:   article > 正文

Vue3实现网页Hls Flv直播流播放_vue3 直播

vue3 直播

近期楼主接到直播流相关的项目,由于没有前端工作经验,以及缺乏视频流相关的知识,一路上磕磕绊绊,现在终于能够正常实现功能。话不多说,先上组件实现

直播流组件实现

Vue3 Hls流组件实现

  1. <template>
  2. <div class="playVideo-layout">
  3. <!-- 播放器 -->
  4. <div id="app-container" class="video-box">
  5. <video
  6. ref="videoElement"
  7. id="videoElement"
  8. controls
  9. muted
  10. style="width: 100%; height: 100%; object-fit: fill"
  11. ></video>
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. import hlsjs from "hls.js";
  17. import {ref , watch,onMounted,inject} from 'vue';
  18. export default {
  19. name: "Success",
  20. props:{
  21. hlsUrl: String,
  22. },
  23. setup(props) {
  24. const videoUrl = ref(null);
  25. const show = (newHlsUrl) => {
  26. const hlsjsInstance = ref();
  27. const video = document.getElementById("videoElement");
  28. console.log(video);
  29. videoUrl.value = newHlsUrl;
  30. if (hlsjs.isSupported()) {
  31. if (hlsjsInstance.value) {
  32. hlsjsInstance.value.destroy();
  33. hlsjsInstance.value = null;
  34. }
  35. hlsjsInstance.value = new hlsjs();
  36. hlsjsInstance.value.loadSource(videoUrl.value);
  37. hlsjsInstance.value.attachMedia(video);
  38. hlsjsInstance.value.on(hlsjs.Events.MANIFEST_PARSED, () => {
  39. setTimeout(() => {
  40. video.play();
  41. }, 1000);
  42. console.log('加载成功');
  43. });
  44. hlsjsInstance.value.on(hlsjs.Events.ERROR, (event, data) => {
  45. console.log('加载失败');
  46. });
  47. } else {
  48. // 处理不支持的情况
  49. }
  50. };
  51. // 使用 watch 监听 hlsUrl 变化
  52. watch(() => props.hlsUrl, (newHlsUrl) => {
  53. show(newHlsUrl); // 在 hlsUrl 变化时执行 show
  54. });
  55. onMounted(() => {
  56. // 在组件挂载后,调用 show 方法
  57. show(props.hlsUrl);
  58. });
  59. return {
  60. videoUrl,
  61. };
  62. },
  63. };
  64. </script>

Vue2 Flv流组件实现(Vue3 也可用)

  1. <template>
  2. <video
  3. id="videoElement"
  4. ref="videoElement"
  5. controls
  6. muted
  7. autoplay
  8. width="100%"
  9. height="100%"
  10. ></video>
  11. </template>
  12. <script>
  13. import flvjs from 'flv.js';
  14. import { ref, watch } from 'vue';
  15. export default {
  16. props: {
  17. flvUrl: String
  18. },
  19. data() {
  20. return {
  21. flvPlayer: null
  22. };
  23. },
  24. mounted() {
  25. console.log("flvUrl is "+this.flvUrl);
  26. this.createFlv();
  27. },
  28. beforeDestroy() {
  29. this.flv_destroy();
  30. },
  31. watch: {
  32. flvUrl(newFlvUrl) {
  33. // 当 flvUrl 更新时重新创建播放器
  34. this.createFlv(newFlvUrl);
  35. console.log("new Flvurl is :"+newFlvUrl);
  36. }
  37. },
  38. methods: {
  39. createFlv(newFlvUrl) {
  40. if (flvjs.isSupported()) {
  41. let videoElement = this.$refs.videoElement;
  42. if (this.flvPlayer) {
  43. this.flv_destroy();
  44. }
  45. this.flvPlayer = flvjs.createPlayer({
  46. type: "flv",
  47. isLive: true,
  48. hasAudio: false,
  49. url: newFlvUrl // 使用 newFlvUrl 作为视频链接
  50. });
  51. this.flvPlayer.attachMediaElement(videoElement);
  52. this.flvPlayer.load();
  53. }
  54. },
  55. flv_destroy() {
  56. if (this.flvPlayer) {
  57. this.flvPlayer.pause();
  58. this.flvPlayer.unload();
  59. this.flvPlayer.detachMediaElement();
  60. this.flvPlayer.destroy();
  61. this.flvPlayer = null;
  62. }
  63. }
  64. }
  65. }
  66. </script>

开发中遇到的问题

1.父子组件通信相关问题

正如序言所说,楼主之前没有前端开发的工作经验,故组件通信这一块不太熟,在Flv格式中的代码,props传递,被父组件更新之后能够成功被watch观测到并执行链接更新的相关操作。

但是在Hls流的开发过程中,使用这种Vue2类型的函数写法,更新的"newHlsUrl"不能成功被观测并实时更新。故而使用Vue3的setup()函数,在setup()函数中完成对所有业务逻辑的编写。

2.DOMException

在将Hls流的业务逻辑放在setup()之前,由于楼主对Vue3的组件生命周期不了解,出现了许多错误,如:

  • DOMException: The element has no supported sources.
  • DOMException: failed to load because no supported source was found.
  • DOMException: the play() request was interrupted by a new load request.

对于上述错误,本人在尝试逐个解决时屡屡碰壁,在将我的Hls业务代码转移到Setup()函数中不再有问题,具体原因大概与异步执行有关,因为本人的Url是通过网络异步通信实时获得的。在传递给子组件的过程中也是异步过程,所以对video().play就可能出现以上错误。
当转移至setup()之后,watch函数的成功执行,使得异步问题得以解决,能够正常播放流数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/195294
推荐阅读
相关标签
  

闽ICP备14008679号