Hanah_pln 2025-01-14 16:56 采纳率: 50%
浏览 11

canvas在el-carousel轮播图组件,播放websocket视频源播放不出来,单独放在模板中就能播放,求解惑!

canvas在el-carousel轮播图组件,播放websocket视频源播放不出来,单独放在模板中就能播放,求解惑!


<template>
  <!-- <div :class="[b(), className]" ref="main1" @click="handleClick">111
    <div  ref="main">
      <canvas id="videoCanvas"></canvas>
    </div>
  

  </div> -->
  <div :class="[b(),className]"
       :style="styleSizeName"
       ref="main1">
       {{ rtspUrl }}
    <el-carousel :style="styleChartName"
                 :type="type"
                 :indicator-position="indicator"
                 :interval="interval"
                 :height="height">
      <el-carousel-item v-for="(item,index) in dataChart"
                        :key="index"
                        @click="handleClick(item,index)">
       <div v-if="typeList.img.test(item.value)">
        <img 
             :src="item.value"
             draggable="false"
             :style="styleName" />
       </div>
     
        <video muted
               v-bind="params"
               v-else-if="typeList.video.test(item.value)"
               :src="item.value"
               :style="styleName">
        </video>
        <avue-echart-clapper v-else-if="item.type=='hls'"
                             :width="width"
                             :height="height"
                             :key="index"
                             :data="{value:item.value}"
                             :option="hlsOption"></avue-echart-clapper>
        <avue-echart-iframe v-else-if="item.type=='iframe'"
                            :width="width"
                            :height="height"
                            :data="{value:item.value}"></avue-echart-iframe>
                            <div v-else  ref="main">
        <canvas id="videoCanvas"></canvas>
       </div>
      </el-carousel-item>
    </el-carousel>
  </div> 
</template>

<script>
import create from "../../create";
export default create({
  name: "swiper",
  data() {
    return {
      player: null, // 用于存储 JSMpeg Player 实例
      rtspUrl:"",
      typeList: {
        img: /\.(gif|jpg|jpeg|png|GIF|JPG|PNG)/,
        video: /\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|ogg|mp4)/
      }
    };
  },
  computed: {
    hlsOption () {
      return {
        autoplay: this.option.autoplay
      }
    },
    params () {
      let result = {}
      if (this.option.controls) result.controls = "controls"
      if (this.option.loop) result.loop = "loop"
      if (this.option.autoplay) result.autoplay = "autoplay"
      return result
    },
    styleName () {
      return {
        width: '100%',
        height: '100%',
        opacity: this.opacity
      };
    },
    indicator () {
      return this.opacity.indicator || "none";
    },
    opacity () {
      return (this.option.opacity || 100) * 0.01;
    },
    type () {
      return this.option.type || "";
    },
    interval () {
      return this.option.interval || 5000;
    }
  },
  created() {
   
  },
  mounted() {
    this.$nextTick(() => {
      this.dataChart.forEach(obj => {
        this.rtspUrl=obj.value
        console.log(this.rtspUrl,'cc11')
});

      this.player = new window.JSMpeg.Player(this.rtspUrl, {
      canvas: this.$refs.main.querySelector('#videoCanvas')
    });
    this.updateCanvasSize();
    window.addEventListener('resize', this.updateCanvasSize);
    });

  
  },
  beforeDestroy() {
    if (this.player) {
      this.player.destroy(); // 在组件销毁前销毁播放器实例,避免内存泄漏
    }
    window.removeEventListener('resize', this.updateCanvasSize);
  },
  methods: {
    handleClick() {

    },
    updateCanvasSize() {
      const parentElement = this.$refs.main;
      const width = parentElement.clientWidth;
      const height = parentElement.clientHeight;
      const canvas = this.$refs.main.querySelector('#videoCanvas');
      canvas.width = width;
      canvas.height = height;
      if (this.player) {
        this.player.resize(); // 如果 JSMpeg Player 有 resize 方法,可以调用它来更新画布大小
      }
    }
  },
  props: {
    option: {
      type: Object,
      default: () => {
        return {};
      }
    },
    className: {
      type: String,
      default: ''
    },
    styleSizeName: {
      type: Object,
      default: () => {
        return {};
      }
    },
    dataChart: {
      type: Object,
      default: () => {
        return {};
      }
    }
  }
});
</script>

<style scoped>
/* 根据需要添加样式 */
#videoCanvas {
  width: 100%;
  height: 100%;
}
</style>
轮播数组
[
    {
        "value": "https://img.alicdn.com/tfs/TB1v28TC8v0gK0jSZKbXXbK2FXa-1880-640.jpg"
    },
    {
        "value": "ws://11.54.90.239:8888/"
    }
]

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的问题涉及到在el-carousel轮播组件中使用canvas来播放websocket视频流的问题。根据你给出的代码和问题描述,问题可能在于以下几点:

    1. 视频流播放时机问题:你的代码是在mounted生命周期钩子中初始化播放器并播放视频流的。但是,这个操作是在整个组件加载完成后进行的,这意味着当视频播放的时候,它可能已经不在轮播组件的当前活动项中。这可能导致视频无法正常播放。因此,你可能需要在轮播项的mounted钩子中初始化播放器,而不是在组件的mounted钩子中。此外,确保每次轮播项变化时重新调整视频大小以适应当前的活动项。这可能需要在处理轮播组件的change事件时完成。
    2. canvas元素定位问题:在el-carousel组件中,每个el-carousel-item都有自己的作用域,因此你需要确保canvas元素是在正确的el-carousel-item内部。在你的代码中,canvas元素被放在了最外层的div中,而不是每个el-carousel-item内部。你需要将canvas元素移动到每个el-carousel-item内部,并绑定到对应的视频源。此外,要确保在更新活动项时更新canvas元素的引用。
    3. 视频源问题:确认你的websocket视频源是正确的,并且服务器已经准备好接受连接并发送数据。此外,确认你的浏览器支持websocket和该协议中的媒体格式。此外,对于使用websocket的视频流,你可能还需要确保服务器端正确地设置了跨域资源共享(CORS)策略,否则浏览器可能会阻止加载视频数据。

    针对上述问题,你可能需要对代码进行一些修改和调整。希望这些建议能帮助你解决问题。如果你仍然遇到问题,建议详细调试并查看控制台中的任何错误信息,以获取更多关于问题的线索。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月14日