美文网首页
在Vue中使用Video-player,动态src以及页面只播放

在Vue中使用Video-player,动态src以及页面只播放

作者: hello_web_Front | 来源:发表于2020-10-27 10:18 被阅读0次

    我的功能:一个tabs标签 content里面是视频,tabs切换显示不同的视频,大概就是下面的功能,然后红色框起来的是视频(这里因为晚上回来写的,所以没有数据,先这样看着)


    2020-10-27_203333.png

    video-player https://github.com/surmon-china/vue-video-player,具体怎么使用网上一大堆。https://www.cnblogs.com/zr123/p/10660296.html

    使用v-for循环动态的生成多个src
    这里对后台返回的每一个数据,进行一次循环,给我们的每个视频资源数据上加上一个playerOptions对象,这样使用的时候
    就可以使用

                    <video-player
                        class="video-player vjs-custom-skin"
                        ref="videoPlayer"
                        @play="onPlayerPlay($event)"
                        :playsinline="true"
                        :options="ele.playerOptions"
                      ></video-player>
    
    async init() {
          try {
            const res = await getVideoList();
            console.log(res);
            if (res.status == 200) {
              res.result.forEach((ele) => {
                ele.videoList.forEach((element) => {
                  let playerOptions = {
                    playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
                    autoplay: false, //如果true,浏览器准备好时开始回放。
                    muted: false, // 默认情况下将会消除任何音频。
                    loop: false, // 导致视频一结束就重新开始。
                    preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
                    language: "zh-CN",
                    aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
                    fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
                    sources: [
                      {
                        src: element.videoUrl, // 路径
                        type: "video/mp4", // 类型
                      },
                    ],
                    poster: "@/assets/camera.png", //你的封面地址
                    width: document.documentElement.clientWidth,
                    notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
                    controlBar: {
                      timeDivider: true,
                      durationDisplay: true,
                      remainingTimeDisplay: false,
                      fullscreenToggle: true, //全屏按钮
                    },
                  };
                  element.playerOptions = playerOptions;
                });
              });
              console.log(res.result);
              this.itemList = res.result;
            }
          } catch (error) {console.log(error)}
        },
    

    页面上只能播放一个

    监听视频的播放@play="onPlayerPlay($event)",每次视频播放的时候都会触发这个函数,这样就可以通过事件参数拿到当前是哪个视频在播放,也就是拿到正在播放的这个元素标签。还需要注意的是,如果使用video-player你会发现每一个视频就都会有一个id属性,这样通过事件参数的这个对象(前面说了可以拿到元素),这样就可以拿到当前这个正在播放的视频id,这样再通过document.getElementsByTagName("video")拿到页面上所有的视频,然后通过getAttribute属性拿到每一个视频的id,这样就可以区分哪个视频正在播放,具体的代码如下:

          // 获取当前点击播放的是视频id
          let currentVideo = e.el_.children[0].getAttribute("id");
          // 获取页面上所有的video标签
          let videoList = document.getElementsByTagName("video");
          for (let i = 0; i < videoList.length; i++) {
            // 让除了当前视频之外的全部视频pause,这样就实现啦
            let id = videoList[i].getAttribute("id");
            if (currentVideo != id) {
              videoList[i].pause();
            }
          }
    

    我的需求是tabs,监听tabs的切换 每次切换暂停页面上所有的视频即可。

    如果有不对的地方,欢迎指正,实习生一枚!
    贴一下完整代码把,因为有人要看

    <template>
      <div class="installVideo">
        <my-head title="服务中心"></my-head>
        <div
          class="content"
          style="padding: .1rem;font-size:.14rem;background:#f5f5f5;padding-top:.7rem;"
        >
          <my-search placeholder="输入关键字搜索"></my-search>
          <van-tabs v-model="active" swipeable    @change="changeHandle">
            <van-tab
              v-for="(item, index) in itemList"
              :title="item.title"
              :key="index"
           
            >
              <div
                class="card m-top-1 b-radius "
                style=""
                v-for="(ele, cardIndex) in item.videoList"
                :key="cardIndex"
              >
                <!-- :src="ele.videoUrl" -->
                <div
                  class="title   f-weight d-flex j-sb a-center"
                  style="height:2rem;"
                >
                  <div class="h100" style="width:3.5rem;height:2rem;">
                    <div style="height:2rem;">
                      <video-player
                        class="video-player vjs-custom-skin"
                        ref="videoPlayer"
                        @play="onPlayerPlay($event)"
                        :playsinline="true"
                        :options="ele.playerOptions"
                      ></video-player>
                    </div>
                  </div>
                </div>
                <div class="content p1 d-flex j-center a-center fff">
                  {{ ele.productType }}
                </div>
              </div>
            </van-tab>
          </van-tabs>
        </div>
      </div>
    </template>
    <script>
    import { getVideoList } from "../../api/installVideo";
    export default {
      name: "installVideo",
      data() {
        return {
          active: 0,
          itemList: [
            {title:'后入'},
            {title:69}
          ],
        };
      },
      methods: {
        // 监听视频播放的回调
        async onPlayerPlay(e) {
          let currentVideo = e.el_.children[0].getAttribute("id", 64);
          let videoList = document.getElementsByTagName("video");
          for (let i = 0; i < videoList.length; i++) {
            let id = videoList[i].getAttribute("id");
            if (currentVideo != id) {
              videoList[i].pause();
            }
          }
        },
        // tabs每次切换的时候都需要将页面上video进行暂停
        changeHandle() {
          console.log(11)
          this.$nextTick((_) => {
            let videos = document.getElementsByTagName("video");
            for (let i = 0; i < videos.length; i++) {
              videos[i].pause();
            }
          });
        },
        async init() {
          try {
            const res = await getVideoList();
            console.log(res);
            if (res.status == 200) {
              res.result.forEach((ele) => {
                ele.videoList.forEach((element) => {
                  let playerOptions = {
                    playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
                    autoplay: false, //如果true,浏览器准备好时开始回放。
                    muted: false, // 默认情况下将会消除任何音频。
                    loop: false, // 导致视频一结束就重新开始。
                    preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
                    language: "zh-CN",
                    aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
                    fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
                    sources: [
                      {
                        src: element.videoUrl, // 路径
                        type: "video/mp4", // 类型
                      },
                    ],
                    poster: "@/assets/camera.png", //你的封面地址
                    width: document.documentElement.clientWidth,
                    notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
                    controlBar: {
                      timeDivider: true,
                      durationDisplay: true,
                      remainingTimeDisplay: false,
                      fullscreenToggle: true, //全屏按钮
                    },
                  };
                  element.playerOptions = playerOptions;
                });
              });
              console.log(res.result);
              this.itemList = res.result;
            }
          } catch (error) {console.log(error)}
        },
      },
      mounted() {
        // this.videoElement = document.getElementsByTagName("video");
        // console.log(this.videoElement);
        this.init();
      },
    };
    </script>
    
    <style scoped lang="less" scoped></style>
    
    

    相关文章

      网友评论

          本文标题:在Vue中使用Video-player,动态src以及页面只播放

          本文链接:https://www.haomeiwen.com/subject/zqitvktx.html