Использование видеоплеера vue-video-player и ссылка на пример мульти-видео дворца
Использование видеоплеера vue-video-player и ссылка на пример мульти-видео дворца

Установить

существовать В проектеиспользоватьnpmЗаказ Установить Вот и все

Язык кода:javascript
копировать
npm install vue-video-player

существовать Установитьв процессе,npm загрузит последнюю версию vue-video-player и добавит ее в проект. Установить После завершения,Мы можем использовать компонент vue-video-player в существующем проекте.

также,vue-video-player зависит от библиотеки видеоплеера video.js,Таким образом, Installvue-video-player также автоматически установитvideo.js. если необходимо,Мы также можем вручную указать версию video.js при существовании Установитьvue-video-player.

Язык кода:javascript
копировать
npm install vue-video-player@latest video.js@7.9.0

Конфигурация в проекте

Глобальная конфигурация в основном существовании.js,проходитьwindow.videojs = VueVideoPlayer.videojsобозначениеиспользоватьvue-video-playerвvideojs(если В проектеvideojsконфликт,Может быть ошибка, что videojs не найден).

Язык кода:javascript
копировать
// компонент видеоплеера
import VueVideoPlayer from 'vue-video-player'
window.videojs = VueVideoPlayer.videojs
require('video.js/dist/lang/zh-CN.js')
import 'video.js/dist/video-js.css'
import 'vue-video-player/src/custom-theme.css'
import 'videojs-contrib-hls'
import 'videojs-flash'

использовать

существуют В этом случае,Мы используем компонент vue-video-player для воспроизведения видео. Сначала мы определяем объект параметров для видеоплеера.,Он содержит адрес источника, параметры воспроизведения и другую информацию о видео. наконец,В нашем существующем шаблоне есть компонент видеоплеера для воспроизведения видео.,И отслеживайте статус воспроизведения и паузы видео с помощью событий @play и @pause.

Язык кода:javascript
копировать
<template>
  <div>
    <video-player
      ref="videoPlayer"
      :options="videoPlayerOptions"
      @play="handlePlay"
      @pause="handlePause"
    ></video-player>
  </div>
</template>

<script>

export default {
  name: "Vedio",
  components: {
    videoPlayer
  },
  data() {
    return {
      videoPlayerOptions: {
        autoplay: true, // Автозапуск
        muted: true, // немой
        fluid: true, // Адаптивный контейнер воспроизведения
        language: 'zh-CN', // Китайские советы
        playbackRates: [0.7, 1.0, 1.5, 2.0], // Играйте на удвоенной скорости
        sources: [
          
          {
            type: 'video/mp4', // Воспроизвести тип видео mp4
            src: 'http://vjs.zencdn.net/v/oceans.mp4' // Воспроизвести видео по ссылке
          },
          {
            type: 'application/x-mpegURL', // hls Нужно зависеть от videojs-contrib-hls
            src: "http://url.video.com/newhls/live1/index.m3u8",
          },
        ],
        poster: "https://dogefs.s3.ladydaily.com/~/source/wallhaven/small/8o/8old52.jpg?w=400&h=200&fmt=webp", // крышка
      }
    };
  },
  methods: {
    handlePlay() {
      console.log('Video is playing.');
    },
    handlePause() {
      console.log('Video is paused.');
    }
  }
};
</script>

Пример с несколькими сетками

Код нельзя запустить напрямую, он предоставлен только для справки.

Язык кода:javascript
копировать
<template>
  <div class="app-container" style="padding: 0">
    <el-container style="height: calc(100vh - 50px)">
      <el-aside width="200px" style="background-color: #FFFFFF">
        <!--Данные дерева боковой панели-->
        <div class="head-container">
          <el-input
            v-model="dataspaceName"
            Placeholder="Пожалуйста, введите имя устройства"
            clearable
            size="small"
            prefix-icon="el-icon-search"
            style="margin-bottom: 20px"
          />
        </div>
        <div class="head-container">
          <el-tree
            :data="dataspaceOptions"
            :props="defaultProps"
            :expand-on-click-node="false"
            :filter-node-method="filterNode"
            ref="tree"
            node-key="id"
            default-expand-all
            highlight-current
            @node-click="handleNodeClick"
          />
        </div>
      </el-aside>
      <el-container style="width: 100%;">
    
        <el-col :span="20" :xs="24" style="width: 100%;">
          <div class="cell">
            <div class="cell-tool" style="padding-top: 10px;">
              <div class="bk-button-group">
                <el-button @click="cellCount = 1" size="small">1</el-button>
                <el-button @click="cellCount = 4" size="small">4</el-button>
                <el-button @click="cellCount = 9" size="small">9</el-button>
                <el-button @click="cellCount = 16" size="small">16</el-button>
              </div>
            </div>
            <div class="cell-player" style="padding-top: 10px;">
              <div :class="cellClass(i)" v-for="i in cellCount" :key="i">
                <el-row style="height: 100%;">
                  <el-col :span="18" style="height: 100%;">
                    <video-player
                      class="video-player vjs-custom-skin"
                      :options="playerOptions[i]"
                      ref="videoPlayer"
                      :playsinline="true"
                      @ready="playerReadied">
                    </video-player>
                  </el-col>
                  <el-col :span="6" style="padding: 0 1px 0 1px; height: 100%;">
                    <el-card style="height: 100%;">
                      <div slot="header" class="clearfix">
                        <span>оборудование</span>
                        <el-button style="float: right; padding: 3px 0" type="text">Кнопка действия</el-button>
                      </div>
                      <div v-for="o in 4" :key="o" class="text item">
                        {{ 'Параметры устройства ' + o }}
                      </div>
                    </el-card>
                  </el-col>

                </el-row>
              </div>
            </div>
          </div>
        </el-col>
      </el-container>
    </el-container>
  </div>
</template>

<script>
import {listTree} from "@/api/edge/monitor";

export default {
  name: "Vedio",
  dicts: [],
  components: {},
  data() {
    return {
      loading: false,
      cellCount: 1,
      // варианты дерева
      dataspaceName: undefined,
      dataspaceOptions: [],
      // параметры формы
      form: {},
      defaultProps: {
        children: "children",
        label: "label"
      },
      playerOptions: [
        {},
        {
          preload: 'auto',
          sources: [
            {
              type: 'application/x-mpegURL',
              src: "http://video.com/newhls/live1/index.m3u8",
            },
          ],
          autoplay: true,
          muted: true,
          language: 'zh-CN',
          fluid: false,
          controls: true,
          notSupportedMessage: «В данный момент это видео невозможно воспроизвести. Повторите попытку позже»,
          controlBar: {
            timeDivider: false,
            durationDisplay: false,
            remainingTimeDisplay: false,
            fullscreenToggle: true
          }
        },
        {
          preload: 'auto',
          sources: [
            {
              type: 'application/x-mpegURL',
              src: "http://video.com/newhls/live1/index.m3u8",
            },
          ],
          autoplay: true,
          muted: true,
          language: 'zh-CN',
          // fluid: true,
          controls: true,
          notSupportedMessage: «В данный момент это видео невозможно воспроизвести. Повторите попытку позже»,
          controlBar: {
            timeDivider: false,
            durationDisplay: false,
            remainingTimeDisplay: false,
            fullscreenToggle: true
          }
        },
        {
          preload: 'auto',
          sources: [
            {
              type: 'application/x-mpegURL',
              src: "http://video.com/newhls/live3/index.m3u8",
            },
          ],
          autoplay: true,
          muted: true,
          language: 'zh-CN',
          // fluid: true,
          controls: true,
          notSupportedMessage: «В данный момент это видео невозможно воспроизвести. Повторите попытку позже»,
          controlBar: {
            timeDivider: false,
            durationDisplay: false,
            remainingTimeDisplay: false,
            fullscreenToggle: true
          }
        },
        {
          preload: 'auto',
          sources: [
            {
              type: 'application/x-mpegURL',
              src: "http://video.com/newhls/live3/index.m3u8",
            },
          ],
          autoplay: true,
          muted: true,
          language: 'zh-CN',
          // fluid: true,
          controls: true,
          notSupportedMessage: «В данный момент это видео невозможно воспроизвести. Повторите попытку позже»,
          controlBar: {
            timeDivider: false,
            durationDisplay: false,
            remainingTimeDisplay: false,
            fullscreenToggle: true
          }
        }
      ],
      queryParams: [],

    };
  },
  watch: {
    dataspaceName(val) {
      this.$refs.tree.filter(val);
    }
  },
  computed: {
    cellClass() {
      return function (index) {
        switch (this.cellCount) {
          case 1:
            return ['cell-player-1']
          case 4:
            return ['cell-player-4']
          case 6:
            if (index == 1)
              return ['cell-player-6-1']
            if (index == 2)
              return ['cell-player-6-2']
            if (index == 3)
              return ['cell-player-6-none']
            return ['cell-player-6']
          case 9:
            return ['cell-player-9']
          case 16:
            return ['cell-player-16']
          default:
            break;
        }

      }
    },
  },
  created() {
    this.getTree();
  },
  methods: {
    getTree() {
      this.loading = true;
      listTree().then((res) => {
        console.log(res)
        this.dataspaceOptions = res.data;
      })
    },

    // Событие щелчка узла
    handleNodeClick(data) {
      this.queryParams.ueId = data.id;
      // Получить URL-адрес видео с устройства
      let myPlayer = this.$refs.videoPlayer.player;
      // заменятьвидео ...
      myPlayer.src("");
    },
    // Фильтровать узлы
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    /**
     * Переключить видео
     */
    showVideo() {
      let myPlayer = this.$refs.videoPlayer.player;

      // Раньше использовалось для прямого переключения между несколькими источниками видео, но теперь источник видео только один.
      myPlayer.src("");
    },

    onPlayerPause(player) {
      console.log(player);
    },
    onPlayerPlay(player) {
      console.log('player play!', player)
    },

    playerStateChanged(playerCurrentState) {
      console.log('player current update state', playerCurrentState)
    },

    // player is ready
    playerReadied(player) {
      console.log('the player is readied', player)
      // you can use it to do something...
      // player.[methods]
    }
  }

};
</script>

<style scoped>
.cell-tool {
  height: 40px;
  line-height: 30px;
  padding: 0 7px;
}

.cell-player {
  flex: 1;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}

.cell-player-4 {
  width: 50%;
  height: 50% !important;
  box-sizing: border-box;
}

.cell-player-1 {
  width: 100%;
  box-sizing: border-box;
}

.cell-player-6-1 {
  width: 66.66%;
  height: 66.66% !important;
  box-sizing: border-box;
}

.cell-player-6-2 {
  width: 33.33%;
  height: 66.66% !important;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
}

.cell-player-6-none {
  display: none;
}

.cell-player-6-2-cell {
  width: 100%;
  height: 50% !important;
  box-sizing: border-box;
}

.cell-player-6 {
  width: 33.33%;
  height: 33.33% !important;
  box-sizing: border-box;
}

.cell-player-9 {
  width: 33.33%;
  height: 33.33% !important;
  box-sizing: border-box;
}

.cell-player-16 {
  width: 25%;
  height: 25% !important;
  box-sizing: border-box;
}

.cell {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.video-player {
  height: 100%;
  width: 100%;
  background: #000;
}


</style>

ссылка:docs.videojs.com/

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.