Video.js - это библиотека с открытым исходным кодом, предназначенная для создания видео плеера.
Сама по себе библиотека очень проста. Дополнительная функциональность поставляется в плагинах(плейлисты, аналитика,
реклама, и расширенные форматы видео - HLS
или DASH
).
npm install --save video.js
<script src="http://vjs.zencdn.net/6.9.0/video.js"></script>
<link href="http://vjs.zencdn.net/6.9.0/video-js.css" rel="stylesheet">
На странице должен присутствовать тег:
<video class="video-js"></video>
Передаем строку содержащую id
элемента:
let video = videojs('id');
Или DOM
элемент
let video = videojs(document.querySelector('.video-js'));
Опции передаются вторым параметром:
let video = videojs('my-video', {
autoplay: false,
});
Основные опции:
autoplay: boolean
- автоматическое воспроизведение;controls: boolean
- отображать ли интерфейс плеера;loop: boolean
- зацикливание воспроизведения видео;muted: boolean
- приглушение звука;poster: string
- ссылка на превью видео;width: string|number
- ширина видео;height: string|number
- высота видео;
Дополнительные опции:
fluid: boolean
- подгонять ли видео под размер контейнера;aspectRatio: string
- соотношение сторон видео (16:9, 4:3);
-
src(string|array)
- позволяет задать источник видео;video.src('/path/to/video.mp4'); video.src([ { type: 'video/mp4', src: '/path/to/video.mp4', }, { type: 'video/webm', src: '/path/to/video.webm', }, { type: 'video/ogg', src: '/path/to/video.ogg', }, ]);
-
poster(string)
- позволяет задать превью видео; -
play()
- воспроизводит видео; -
pause()
- ставит видео на паузу; -
paused()
- возвращаетtrue
, если видео стоит на паузе, иначеfalse
; -
dispose()
- полностью удаляет плеер (вызывает событиеdispose
, удаляет все обработчики событий, удаляетDOM
элементы); -
volume(number)
- задает горомкость звука (число от0
до1
); если вызвать без параметра - возвращает текущее значение; -
muted(bolean)
- возвращаеtrue
, если звук выключен, иначеfalse
; если переданоtrue
- выключает звук. -
requestFullscreen()
- вход в полноэкранный режим; -
exitFullscreen()
- выход из полноэкранного режима; -
isFullscreen()
- возвращаетtrue
если видео находится в полноэкранном режиме, иначеfalse
; -
currentTime(number)
- возвращает текущее место воспроизведения (в секундах); если передать число - устанавливает текущее место; -
duration()
- возвращает длину видео; -
remainingTime()
- возвращает оставшееся время;
Пример:
let video = videojs('video', {
controls: true,
autoplay: false,
loop: false,
poster: '/video/cover.jpg',
});
video.src({
src: '/video/video.mp4',
withCredentials: true,
});
video.on('ready', () => {
// ...
});
События те же, что у нативного элемента video
.
Полный список тут.
Пример:
video.on('dispose', () => {
// ...
});
video.on('play', () => {
// ...
});
video.on('ended', () => {
// ...
});
Для стриминга video.js
использует плагин videojs-contrib-hls.
Как подготовить видео - описано тут
npm install --save videojs-contrib-hls
let video = videojs('my-video', {
controls: true,
autoplay: true,
loop: false,
poster: '/video/cover.jpg',
html5: {
nativeAudioTracks: false,
nativeVideoTracks: false,
nativeTextTracks: false,
hls: {
overrideNative: true,
},
},
});
video.src({
src: 'video-name.m3u8',
type: 'application/x-mpegURL',
withCredentials: true,
});
Для воспроизведения стриминга с других серверов, необходимо установить свойство withCredentials: false
.
Для ручного выбора качества видео, необходимо установить 2 плагина:
npm install --save videojs-contrib-quality-levels videojs-hls-quality-selector
После указания источника видео, нужно вызвать метод .hlsQualitySelector()
для экземпляра видео.
Пример
video.src({
src: `video.m3u8`,
type: 'application/x-mpegURL',
withCredentials: false,
});
video.hlsQualitySelector();
Для субтриров используются файлы в формате .vtt
.
Пример
WEBVTT
00:01.000 --> 00:04.000
Never drink liquid nitrogen.
00:05.000 --> 00:09.000
- It will perforate your stomach.
Что бы подключить субтитры к видео - нужно использовать метод .addRemoteTextTrack()
.
Пример
video.addRemoteTextTrack({
label: 'Russian',
kind: 'captions',
src: 'subtitles.vtt',
default: true,
}, false);
Задать стили субтитрам можно так (здесь используется !important
, так как video.js задает стили инлайн):
.vjs-text-track-display {
display: block;
pointer-events: none;
div {
font-family: Arial, sans-serif !important;
font-size: 40px !important;
background-color: transparent !important;
}
}
По умолчанию используется стандартный скин.
<link href="http://vjs.zencdn.net/6.7.1/video-js.css" rel="stylesheet">
Стандартный скин:
Отображение без стилей:
Для кастомной стилизаци, нужно использовать свои стили.
Пример своей стилизации:
- Контейнер
Вписываем контейнер в блок, у которого заданы размеры требуемые по макету.
<div id="video" class="video-js"></div>
.video-js {
width: 100%;
height: 100%;
}
- Элемент
<video>
Подгоняем формат, для предотвращения деформирования видео.
.vjs-tech {
width: auto;
height: 100vh;
min-width: 100vw;
object-fit: cover;
@media (min-aspect-ratio: 1920 / 1080) {
width: 100vw;
height: auto;
min-height: 100vh;
}
}
-
Обложка
.vjs-poster
-
Спинер
.vjs-loading-spinner
-
Кнопка воспроизведение\пауза
.vjs-play-control
-
Кнопка вкл\выкл звук
.vjs-mute-control
-
Полоса громкости
.vjs-volume-bar
-
Текущее время видео
.vjs-current-time
-
Длительность видео
.vjs-duration
-
Оставшееся время
.vjs-remaining-time
-
Прогресс бар
.vjs-progress-control
-
Кнопка полноэкранного режима
.vjs-fullscreen-control
Пример:
.vjs-progress-control {
display: block;
}
.vjs-progress-holder {
position: relative;
height: 4px;
cursor: pointer;
&::before {
content: "";
position: absolute;
left: 0;
width: 100%;
height: 4px;
background-color: #fff;
}
}
.vjs-play-progress {
position: relative;
display: block;
width: 0;
height: 4px;
background-color: #000;
.vjs-control-text {
display: none;
}
.vjs-time-tooltip {
display: none;
}
}