База знаний Глабикс.Экран
Что такое Глабикс.Экран
Как установить Глабикс.Экран
Как записать видеосообщение
Возможности видеосообщения
Редактор видеосообщений
Библиотека видеосообщений
Доступы к видеосообщениям
Вставка в сторонние платформы
Аналитика видеосообщений
Брендирование страницы просмотра видеосообщений
Ограничения хранилища
Настройка единого входа (SSO) через AD FS
API для управления встроенным видеоплеером
Glabix Embed Player — PostMessage API
API для управления встроенным видеоплеером Glabix через iframe с родительской страницы.
Встраивание
<iframe id="player" src="https://app.glabix.com/share/embed/{UUID}" allow="autoplay" allowfullscreen></iframe>
Query-параметры:
?t=30— начать воспроизведение с 30-й секунды?autoplay=1— автовоспроизведение при загрузке?muted=1— запустить без звука
allow="autoplay"обязателен, если вы планируете запускать воспроизведение через postMessage-командуplay. Без него браузер заблокирует вызовplay().
Протокол сообщений
Все сообщения имеют формат { type: 'glabix-player', ... }.
Родительская страница → Плеер (команды)
Отправка команд плееру через postMessage:
const iframe = document.getElementById('player');
// Перемотать на 30-ю секунду
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'seek', data: { time: 30 } }, '*'
);
// Запустить воспроизведение
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'play' }, '*'
);
// Поставить на паузу
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'pause' }, '*'
);
// Запросить текущее время (ответ: событие 'currentTime')
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'getCurrentTime' }, '*'
);
// Запросить длительность (ответ: событие 'duration')
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'getDuration' }, '*'
);
// Запросить полное состояние воспроизведения (ответ: событие 'playbackState')
iframe.contentWindow.postMessage(
{ type: 'glabix-player', action: 'getPlaybackState' }, '*'
);
Плеер → Родительская страница (события)
Подписка на события плеера:
window.addEventListener('message', (e) => {
if (e.data?.type !== 'glabix-player') return;
switch (e.data.event) {
case 'ready':
// Плеер загружен, можно отправлять команды
// e.data.data = { duration: 120.5 }
break;
case 'timeupdate':
// Срабатывает ~4 раза в секунду во время воспроизведения
// e.data.data = { time: 30.5 }
break;
case 'play':
// Воспроизведение началось
// e.data.data = { time: 30.5 }
break;
case 'pause':
// Воспроизведение приостановлено
// e.data.data = { time: 30.5 }
break;
case 'seeked':
// Перемотка завершена
// e.data.data = { time: 30.0 }
break;
case 'ended':
// Видео закончилось
break;
case 'currentTime':
// Ответ на 'getCurrentTime'
// e.data.data = { time: 30.5 }
break;
case 'duration':
// Ответ на 'getDuration'
// e.data.data = { duration: 120.5 }
break;
case 'playbackState':
// Ответ на 'getPlaybackState'
// e.data.data = { playing: true, time: 30.5, duration: 120.5 }
break;
}
});
Пример: оглавление видео
<iframe id="player" src="https://app.glabix.com/share/embed/UUID"
style="width:100%;aspect-ratio:16/9;border:none" allow="autoplay" allowfullscreen></iframe>
<nav id="chapters">
<button data-time="0">Вступление</button>
<button data-time="120">Архитектура</button>
<button data-time="360">Демо</button>
<button data-time="540">Вопросы и ответы</button>
</nav>
<script>
const iframe = document.getElementById('player');
const buttons = document.querySelectorAll('#chapters button');
// Клик по главе → перемотка + воспроизведение
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const time = Number(btn.dataset.time);
iframe.contentWindow.postMessage({ type: 'glabix-player', action: 'seek', data: { time } }, '*');
iframe.contentWindow.postMessage({ type: 'glabix-player', action: 'play' }, '*');
});
});
// Подсветка текущей главы по времени воспроизведения
window.addEventListener('message', (e) => {
if (e.data?.type !== 'glabix-player') return;
if (e.data.event !== 'timeupdate') return;
const currentTime = e.data.data.time;
let activeBtn = buttons[0];
buttons.forEach(btn => {
if (currentTime >= Number(btn.dataset.time)) activeBtn = btn;
});
buttons.forEach(btn => btn.classList.toggle('active', btn === activeBtn));
});
</script>
Пример: кастомные контролы
<button onclick="send('play')">Play</button>
<button onclick="send('pause')">Pause</button>
<span id="time">0:00</span>
<script>
const iframe = document.getElementById('player');
function send(action, data) {
iframe.contentWindow.postMessage({ type: 'glabix-player', action, data }, '*');
}
function formatTime(sec) {
const m = Math.floor(sec / 60);
const s = Math.floor(sec % 60);
return m + ':' + String(s).padStart(2, '0');
}
window.addEventListener('message', (e) => {
if (e.data?.type !== 'glabix-player') return;
if (e.data.event === 'timeupdate') {
document.getElementById('time').textContent = formatTime(e.data.data.time);
}
});
</script>
Важно
- Дождитесь события
readyперед отправкой команд — команды, отправленные до инициализации плеера, будут проигнорированы. - Событие
timeupdateсрабатывает примерно 4 раза в секунду. При необходимости добавьте throttle на стороне потребителя. - В примерах
postMessageиспользует'*'как target origin. Для большей безопасности укажите'https://app.glabix.com'при прослушивании событий.