\n\n```\n\nНюансы:\n- Скрипт `https://vk.com/js/api/videoplayer.js` должен загрузиться до вызова `VK.VideoPlayer` (или вызывать инициализацию в обработчике `onload` этого скрипта). \n- Если видео приватное/требует авторизации — плеер может не инициализироваться. \n- После инициализации объект плеера содержит набор методов и событий (в разных версиях API названия методов могут отличаться) — посмотрите `console.dir(player)` в DevTools, чтобы увидеть доступные API.\n\nПодробнее о привычном VOD‑паттерне — в официальной документации: [VK Developer Documentation](https://dev.vk.com/ru/widgets/video) и примерах сообщества: [qna.habr.com](https://qna.habr.com/q/1302430).\n\n---\n\n## Примеры кода: подписка на события плеера в JavaScript (play/pause/ended) {#player-events}\n\nAPI у разных версий плеера может немного отличаться, потому универсальный приём — сначала инспектировать объект, затем подписаться на доступные методы. Пример «безопасной» подписки, которая проверяет несколько вариантов API:\n\n```javascript\nfunction subscribeEvent(player, evt, handler) {\n if (!player) return;\n if (typeof player.on === 'function') {\n player.on(evt, handler); // часто встречается\n } else if (typeof player.addEventListener === 'function') {\n player.addEventListener(evt, handler);\n } else if (typeof player.bind === 'function') {\n player.bind(evt, handler);\n } else {\n console.warn('No event API found on VK player — will attempt polling', evt);\n }\n}\n\n// Пример использования (после успешной инициализации VK.VideoPlayer)\nsubscribeEvent(player, 'play', () => console.log('play'));\nsubscribeEvent(player, 'pause', () => console.log('pause'));\nsubscribeEvent(player, 'ended', () => console.log('ended'));\nsubscribeEvent(player, 'timeupdate', (t) => console.log('time', t));\n```\n\nЕсли событий нет или API ограничен — используйте fallback: короткий polling (раз в 1–2 с) с проверкой доступных методов у объекта:\n```javascript\n// Polling-safe пример\nlet lastTime = 0;\nconst poll = setInterval(() => {\n if (!player) return;\n if (typeof player.getCurrentTime === 'function') {\n const t = player.getCurrentTime();\n if (t !== lastTime) {\n // проигрывание идёт\n lastTime = t;\n }\n } else if ('currentTime' in player) {\n const t = player.currentTime;\n if (t !== lastTime) lastTime = t;\n } else {\n // нет API - остановить polling или перейти к серверному подходу\n clearInterval(poll);\n }\n}, 1000);\n```\n\nНо помните: доступ к свойствам iframe‑вложенного DOM запрещён из-за CORS — polling тут возможен только если API плеера предоставляет методы (postMessage) или если вы используете свой собственный video элемент (см. HLS ниже).\n\nЕсли вы можете получить прямой поток (MP4/HLS), то лучший и самый надёжный путь — подключить внешний плеер (`hls.js` / `video.js`) и подписываться на стандартные события HTMLMediaElement (`playing`, `pause`, `ended`) — пример ниже в разделе Обходы.\n\n---\n\n## Почему live.vkvideo.ru не распознаётся — ограничения для vk live stream {#live-limitations}\n\nПричины, почему ваш код с `https://live.vkvideo.ru/app/embed/...&js_api=1` не работает:\n\n- другой домен и другой шаблон embed — официальный `VK.VideoPlayer` ожидает `vk.com/video_ext.php` (проверка в коде плеера), поэтому он бросает `iframe src is not a VK embed` (см. [vk.com/js/api/videoplayer.js](https://vk.com/js/api/videoplayer.js)); \n- live‑плеер может реализован совсем иначе (специализированный player на live.vkvideo.ru) и не поддерживает js_api handshake; \n- трансляции по сути «поточные» и окончание трансляции может не отражаться событием `ended` у плеера — платформа может просто перестать выдавать сегменты или показывать оффлайн страницу; обсуждение таких ограничений — на [StackOverflow RU](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) и в описании live‑платформы [live.vkvideo.ru](https://live.vkvideo.ru/). \n\nЧто это значит практично? Нельзя заставить `VK.VideoPlayer` работать с iframe, который он не распознаёт. Нельзя надеяться, что `play`/`ended` будут приходить, если плеер на стороне сервиса не передаёт эти события.\n\n---\n\n## Обходные варианты для отслеживания старта/остановки трансляции (HLS, серверный мониторинг, неофициальные API) {#workarounds}\n\nЕсли нельзя использовать `VK.VideoPlayer` для live.vkvideo.ru — есть рабочие альтернативы. Выбор зависит от доступа к прямым потокам и от требований к надёжности.\n\n1) Подключить прямой HLS (m3u8) к внешнему плееру (рекомендуется, если у вас есть URL m3u8) \n- Используйте hls.js / video.js: вы получите стандартные события медиаплеера. Пример:\n```html\n\n\n\n```\n- Минусы: нужен прямой доступ к manifest (CORS) и стабильный URL.\n\n2) Серверный мониторинг манифеста (надежно для оповещений) \n- Сервер опрашивает HLS manifest (или RTMP ingest/статус) и решает, онлайн ли поток. Затем оповещает клиентов через WebSocket/SSE/webhook. Это обходной, надёжный путь, работает независимо от возможностей embed. Пример Node.js‑логики:\n```javascript\nconst axios = require('axios');\nsetInterval(async () => {\n try {\n const res = await axios.get('https://cdn.example.com/live/stream/playlist.m3u8', { timeout: 5000 });\n const data = res.data;\n const isLive = data.includes('#EXTINF') && !data.includes('#EXT-X-ENDLIST');\n // если состояние изменилось — уведомить клиентов\n } catch (e) {\n // 404/timeout => возможно offline\n }\n}, 15000);\n```\n- Минусы: нужно серверное место, возможны ограничения доступа к CDN (авторизация/CORS).\n\n3) Неформальные/неофициальные API и парсинг страницы \n- Есть проекты в сообществе, которые пытаются получить метаданные трансляций у vkplay.live — например [unofficial-vk-play-live-api](https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api). Но они нестабильны и могут нарушать правила — используйте с осторожностью. \n- Для быстрых решений иногда парсят страницу трансляции или используют streamlink/CLI (см. обсуждение [streamlink issue](https://github.com/streamlink/streamlink/issues/879)). Минус: ненадёжно и может быть запрещено правилами сервиса.\n\n4) Запросить официальные webhooks / API (если доступны) \n- Иногда платформа предоставляет серверные уведомления о старте/остановке — стоит проверить документацию платформы или обратиться в поддержку.\n\nИтог: если вы не можете получить прямой поток — лучшая схема для надёжности: серверный мониторинг + нотификации клиентам. Если есть прямой m3u8 — используйте hls.js и стандартные события HTMLMediaElement.\n\n---\n\n## Отладка: ошибка \"iframe src is not a VK embed\" — чеклист {#debugging}\n\nБыстрая проверка — пройдите этот чеклист по порядку:\n\n- Проверьте src iframe — он должен быть `https://vk.com/video_ext.php?...&js_api=1`. Если нет — замените на корректный embed (получите код в ВК). \n- Проверьте наличие параметра `js_api=1` в URL — без него скрипт не активирует JS API. \n- Убедитесь, что `` загружен ДО вызова `VK.VideoPlayer` (или инициализация выполняется в onload скрипта/iframe). \n- Подождите загрузки iframe (`iframe.addEventListener('load', ...)`) — инициализируйте внутри обработчика. \n- Посмотрите в консоль: `console.dir(VK)` и `console.dir(player)` — это покажет доступные методы/события. \n- Если видео приватное/под авторизацией — проверьте, виден ли embed в режиме инкогнито. \n- Если нужен мониторинг live — подумайте о серверном опросе manifest (см. выше). \n- Примеры и объяснения ошибок ищите в обсуждениях: [StackOverflow RU](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) и в официальной документации [VK Widgets — Video](https://dev.vk.com/ru/widgets/video).\n\nЕсли после всех проверок проблема остаётся — пришлите точный iframe src (можно без hash) и скрин консоли — помогу с конкретикой.\n\n---\n\n## Источники {#sources}\n\n- [https://dev.vk.com/ru/widgets/video](https://dev.vk.com/ru/widgets/video) \n- [https://vk.com/js/api/videoplayer.js](https://vk.com/js/api/videoplayer.js) \n- [https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) \n- [https://qna.habr.com/q/1302430](https://qna.habr.com/q/1302430) \n- [https://live.vkvideo.ru/](https://live.vkvideo.ru/) \n- [https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api](https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api) \n- [https://github.com/streamlink/streamlink/issues/879](https://github.com/streamlink/streamlink/issues/879) \n- [https://stackoverflow.com/questions/38969996/vk-com-embed-set-start-time-and-hide-controls](https://stackoverflow.com/questions/38969996/vk-com-embed-set-start-time-and-hide-controls)\n\n---\n\n## Заключение {#conclusion}\n\nКоротко: ваш текущий iframe с `live.vkvideo.ru` не совместим с `VK.VideoPlayer` — отсюда ошибка `iframe src is not a VK embed`. Если цель — отслеживать vk события через `VK.VideoPlayer`, используйте `video_ext.php?...&js_api=1` (VOD). Для live‑трансляций надежнее получить прямой поток (HLS) и подключить `hls.js`/`video.js` или реализовать серверный мониторинг manifest (оповещения через WebSocket/SSE). Нужна помощь с конкретной реализацией (например, пример на hls.js + серверный poll для m3u8 или готовый серверный webhook)? Могу подготовить рабочий пример под ваш кейс."},{"@type":"QAPage","@context":"https://schema.org","mainEntity":{"name":"Как получить события от VK.VideoPlayer с помощью JavaScript для отслеживания запуска и остановки трансляций?","text":"Как инициализировать VK.VideoPlayer для iframe с live.vkvideo.ru, подписаться на события play/pause/ended и обойти ошибку 'iframe src is not a VK embed' для трансляций?","@type":"Question","acceptedAnswer":{"text":"VK.VideoPlayer работает только с video_ext.php&js_api=1 (VOD). Для live используйте HLS с hls.js, серверный мониторинг m3u8 или неофициальные API. Примеры кода для событий и отладки.","@type":"Answer","upvoteCount":13,"dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#message-fba2c5b9-62f8-40c1-8f4e-61320c89896e"},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking","answerCount":1,"dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}]},"mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking"},"inLanguage":"ru","dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking"},{"@type":"CollectionPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#related-questions","name":"Как получить события VK.VideoPlayer в JavaScript для live","description":"Отслеживание vk события play, pause, ended в VK.VideoPlayer: инициализация iframe с js_api=1, ошибки для live.vkvideo.ru, примеры кода, обходные пути с HLS и мониторингом трансляций.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking","inLanguage":"ru","mainEntity":{"@type":"ItemList","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#related-questions","itemListElement":[{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","name":"Tilda формы: запрет повторной отправки с JS","position":1,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions"},"inLanguage":"ru","dateCreated":"2025-11-07T10:54:47.023Z","datePublished":"2025-11-07T10:54:47.023Z","dateModified":"2026-01-12T07:47:41.552Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Tilda формы: запрет повторной отправки с JS","description":"Настройка формы Tilda для запрета дубликатов: используйте localStorage и MutationObserver. Пошаговый гайд по добавлению JS в блок T123, отслеживанию успеха отправки без ID и показу сообщения при повторном клике. Идеально для форм заявок и всплывающих модалок.","keywords":["tilda формы","tilda формы обратной связи","форма заявки tilda","настройка формы tilda","форма tilda zero block","tilda javascript форма"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","name":"Кросс-доменный POST-запрос в JS: Fetch без обновления","position":2,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/cross-domain-post-request-javascript-fetch-cors"},"inLanguage":"ru","dateCreated":"2026-02-24T10:35:27.960Z","datePublished":"2026-02-24T10:35:27.960Z","dateModified":"2026-02-24T18:28:00.024Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","jobTitle":"Технические писатели","description":"Коллектив авторов и технических специалистов, участвующих в создании документации по веб-технологиям"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Бесплатная многоязычная онлайн документация по веб-технологиям для разработчиков","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/developer-mozilla-org/logo.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","name":"Илья Кантор","givenName":"Илья","familyName":"Кантор","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@iliakan","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/iliakan/avatar.png","width":"72","height":"72"},"jobTitle":"Автор, тренер, JS-разработчик","description":"Создатель Modern JavaScript Tutorial, автор и тренер, регулярно обновляет материал с 2007 года"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","name":"Иван Гришаев","givenName":"Иван","familyName":"Гришаев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@igrishaev","jobTitle":"Backend-инженер","description":"Удалённый IT-инженер, backend-разработчик в европейской fintech-компании, специалист по Clojure, SQL, Postgres, функциональному программированию (Lisp), автор двух книг по Clojure, спикер сообщества, отец троих детей, интересуется книгами, переговорами и образованием"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Кросс-доменный POST-запрос в JS: Fetch без обновления","description":"Как отправить кросс-доменный POST-запрос с помощью JavaScript (Fetch или XHR) без обновления страницы. Решение ошибок CORS, blocked by cors policy, разбор ответа response.json() и настройки Access-Control-Allow-Origin.","keywords":["cors","fetch post","blocked by cors policy","кросс-доменный запрос","javascript fetch","xhr post","cors preflight","access-control-allow-origin","fetch cors","ошибка cors","ajax post"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/15218/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/align-multiple-charts-axes-highcharts","name":"Как выровнять оси нескольких графиков в Highcharts","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/align-multiple-charts-axes-highcharts","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/align-multiple-charts-axes-highcharts"},"inLanguage":"ru","dateCreated":"2026-01-16T06:34:36.384Z","datePublished":"2026-01-16T06:34:36.384Z","dateModified":"2026-01-16T06:34:36.384Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как выровнять оси нескольких графиков в Highcharts","description":"Синхронизация осей и выравнивание нескольких графиков в Highcharts: решение проблемы непредсказуемого рендера заголовков. Пошаговая инструкция с кодом, marginLeft, plotLeft и обработкой особых случаев как opposite yAxis.","keywords":["highcharts","выравнивание графиков","синхронизация осей","highcharts оси","выровнять графики highcharts","highcharts marginleft","plotleft highcharts","highcharts chart","график highcharts","highcharts js"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui","name":"Настройка рендеринга Vue.js в консоль с vue-termui","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vue-js-custom-rendering-console-vue-termui"},"inLanguage":"ru","dateCreated":"2025-12-24T09:26:52.001Z","datePublished":"2025-12-24T09:26:52.001Z","dateModified":"2025-12-24T09:26:52.001Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Настройка рендеринга Vue.js в консоль с vue-termui","description":"Как использовать createRenderer для нестандартного рендеринга Vue.js в терминале. Примеры с vue-termui, обработка stdin/stdout, события и типичные ошибки. Готовые решения для консольного UI.","keywords":["vue termui","vue custom renderer","vue консоль","createRenderer","vue terminal","vue js рендеринг","vue-termui","vue 3 renderer","консольный рендерер vue"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive","name":"Слайдер с эффектом peek: Swiper, Slick, Owl адаптивно","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slider-peek-effect-swiper-slick-owl-responsive"},"inLanguage":"ru","dateCreated":"2026-01-16T06:45:56.743Z","datePublished":"2026-01-16T06:45:56.743Z","dateModified":"2026-01-16T06:45:56.743Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Слайдер с эффектом peek: Swiper, Slick, Owl адаптивно","description":"Реализуйте адаптивный слайдер с эффектом peek на Swiper, Slick, Owl Carousel. Настройки slidesPerView, centeredSlides, spaceBetween, breakpoints для мобильных (3 слайда) и десктопов. Формулы расчета ширин и примеры кода.","keywords":["слайдер peek","swiper peek","slick slider peek","owl stagePadding","адаптивный слайдер","slidesPerView","centeredSlides","centerPadding","swiper breakpoints","слайдер html css","карусель с peek"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements","name":"Как изменить стили элементов iframe с видео ВКонтакте","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements"},"inLanguage":"ru","dateCreated":"2026-03-08T06:48:13.494Z","datePublished":"2026-03-08T06:48:13.494Z","dateModified":"2026-03-08T07:19:41.273Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@inkvizitor","name":"Инквизитор","givenName":"Инквизитор","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@inkvizitor","jobTitle":"Фронтенд-разработчик","description":"Профессиональный разработчик, отвечающий на вопросы на Stack Overflow"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@duddeniska","name":"duddeniska","givenName":"duddeniska","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@duddeniska","jobTitle":"Разработчик","description":"Профессиональный разработчик, участвующий в обсуждениях на Stack Overflow"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@ru-stackoverflow-com","name":"Stack Overflow","description":"Русскоязычная версия Stack Overflow - платформа вопросов и ответов для программистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@ru-stackoverflow-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/ru-stackoverflow-com/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@toster-ru","name":"Toster","description":"Вопросы и ответы для разработчиков и IT-специалистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@toster-ru"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","name":"Habr Q&A","description":"Российская платформа вопросов и ответов для IT-специалистов и энтузиастов технологий","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@qna-habr-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/qna-habr-com/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@searchengines-guru","name":"Searchengines.guru","description":"Крупнейший русскоязычный форум и новостной сайт, посвященный поисковой оптимизации, продвижению сайтов, интернет-маркетингу, работе с контекстной рекламой, монетизации трафика, сайтостроению","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@searchengines-guru","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/searchengines-guru/icon.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@vk-com","name":"VK","description":"Крупнейшая европейская социальная сеть с более чем 100 миллионами активных пользователей. Цель - поддерживать связь между старыми друзьями, одноклассниками, соседями и коллегами.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@vk-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/vk-com/logo.png","width":"72","height":"72"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как изменить стили элементов iframe с видео ВКонтакте","description":"Объяснение, почему невозможно изменить стили элементов управления внутри iframe с видео ВКонтакте из-за ограничений безопасности браузеров и альтернативные решения.","keywords":["iframe стили","iframe стиль","iframe вконтакте","вконтакте iframe","iframe css","стилизация iframe","доступ к элементам iframe","изменение стилей во внешнем фрейме","встраивание видео вконтакте","кастомные стили iframe","same-origin policy","ограничения iframe","css iframe","javascript iframe","видео вконтакте"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/browser-javascript-pdf-decryption-password-protected","name":"Расшифровка PDF в браузере с помощью JavaScript: Технические ограничения","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/browser-javascript-pdf-decryption-password-protected","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/browser-javascript-pdf-decryption-password-protected"},"inLanguage":"ru","dateCreated":"2026-04-06T19:22:16.823Z","datePublished":"2026-04-06T19:22:16.823Z","dateModified":"2026-04-06T19:22:16.823Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-team","name":"@pdf-lib-team","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-team","jobTitle":"Разработка ПО","description":"Команда разработки PDF-LIB"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-js-org","name":"PDF-LIB","description":"Библиотека для создания и изменения PDF-документов в любой JavaScript среде","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-js-org"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-contributors","name":"@pdf-lib-contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-lib-contributors","jobTitle":"Разработчики","description":"Контрибьюторы проекта pdf-lib на GitHub"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@github-com","name":"GitHub","description":"Крупнейшая платформа для совместной разработки программного обеспечения с открытым исходным кодом, где миллионы разработчиков, бизнеса и крупнейшее сообщество с открытым исходным кодом создают программное обеспечение, продвигающее человечество.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@github-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/github-com/logo.png","width":"72","height":"72"}},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-js-team","name":"@pdf-js-team","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@pdf-js-team","jobTitle":"Разработка ПО","description":"Команда разработки Mozilla PDF.js"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mozilla-github-io","name":"PDF.js","description":"Платформа на основе веб-стандартов для разбора и рендеринга PDF","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mozilla-github-io"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@nguyen-cuc","name":"Nguyen Cuc","givenName":"Nguyen","familyName":"Cuc","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@nguyen-cuc","jobTitle":"Разработчик Ruby on Rails","description":"Пользователь Stack Overflow, интересуется разработкой веб-приложений на Ruby on Rails"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","name":"Stack Overflow","description":"Крупнейшая в мире платформа вопросов и ответов для профессиональных и энтузиаст-программистов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/stackoverflow-com/logo.png","width":"72","height":"72"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Расшифровка PDF в браузере с помощью JavaScript: Технические ограничения","description":"Почему невозможно расшифровать PDF-файлы, защищенные паролем, в браузере с помощью JavaScript. Анализ ограничений библиотек pdf-lib и PDF.js.","keywords":["pdf в браузере","пароль pdf","javascript pdf","разблокировать пдф онлайн","снять пароль с pdf","браузер pdf скачать","pdf защищен паролем"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/16936/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/16936/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/16936/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript","name":"Как сделать первую букву строки заглавной в JavaScript","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript"},"inLanguage":"ru","dateCreated":"2025-10-20T16:05:01.914Z","datePublished":"2025-10-20T16:05:01.914Z","dateModified":"2026-01-15T10:41:21.407Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как сделать первую букву строки заглавной в JavaScript","description":"Простой способ в JS сделать первую букву строки заглавной, не меняя регистр остальных символов. Примеры кода с проверкой на букву, Unicode-поддержка для кириллицы и путей вроде \"/index.html\". Эффективные методы charAt, slice и regex.","keywords":["сделать первую букву заглавной","javascript строка","первая буква заглавная","js первая буква заглавная","заглавная буква javascript","capitalize first letter js","первый символ строки javascript","работа со строками javascript"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/yandex-maps-api-3-loadingobjectmanager-analog","name":"Аналог LoadingObjectManager в Яндекс Карты API 3.0","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/yandex-maps-api-3-loadingobjectmanager-analog","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/yandex-maps-api-3-loadingobjectmanager-analog"},"inLanguage":"ru","dateCreated":"2026-01-01T14:08:31.732Z","datePublished":"2026-01-01T14:08:31.732Z","dateModified":"2026-01-14T09:05:36.626Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Аналог LoadingObjectManager в Яндекс Карты API 3.0","description":"В Яндекс Карты API 3.0 нет прямого аналога ymaps.LoadingObjectManager из v2.1. Узнайте, как самостоятельно реализовать ленивую загрузку тысяч геоточек: отслеживание bbox, fetch GeoJSON, кластеризация с YMapClusterer. Примеры кода и советы.","keywords":["яндекс карты api 3.0","loadingobjectmanager","ленивая загрузка","ymaps3","yandex maps api v3","кластеризация точек","geojson","yandex maps clusterer","ymaps3 clusterbygrid"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/liquid-glass-effect-css-implementation","name":"Эффект жидкого стекла: реализация CSS и JS кодом","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/liquid-glass-effect-css-implementation","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/liquid-glass-effect-css-implementation"},"inLanguage":"ru","dateCreated":"2025-12-18T11:42:10.029Z","datePublished":"2025-12-18T11:42:10.029Z","dateModified":"2026-01-14T19:07:21.664Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Эффект жидкого стекла: реализация CSS и JS кодом","description":"Как создать эффект жидкого стекла (liquid glass) в графическом интерфейсе с помощью CSS backdrop-filter, SVG-фильтров и JavaScript. Базовый код, продвинутые техники, совместимость браузеров и оптимизация производительности для UI.","keywords":["эффект жидкого стекла","стеклянный эффект","как сделать эффект жидкого стекла","backdrop-filter","liquid glass css","glassmorphism","svg фильтры","css стеклянный эффект"],"image":[],"articleBody":""}}]}}]}
Веб

Как получить события VK.VideoPlayer в JavaScript для live

Отслеживание vk события play, pause, ended в VK.VideoPlayer: инициализация iframe с js_api=1, ошибки для live.vkvideo.ru, примеры кода, обходные пути с HLS и мониторингом трансляций.

1 ответ 13 просмотров

Как получить события от VK.VideoPlayer с помощью JavaScript для отслеживания запуска и остановки трансляций?

Я пытаюсь отследить события запуска и остановки трансляции во встроенном плеере VK, но столкнулся с проблемами при инициализации. Использую следующий код:

html
<iframe
 id="strm"
 src="https://live.vkvideo.ru/app/embed/kotik?autoplay=true&js_api=1"
 allow="autoplay;encrypted-media;fullscreen;picture-in-picture"
 allowfullscreen>
</iframe>
<script src="https://vk.com/js/api/videoplayer.js"></script>

При попытке инициализации плеера:

javascript
const player = VK.VideoPlayer("strm");
// или
const player = VK.VideoPlayer(document.querySelector("#strm"));

Получаю ошибку: Uncaught Error: iframe src is not a VK embed

Также заметил, что для трансляций этот подход не работает, так как видео должно быть предварительно загружено. Интересно, как можно реализовать отслеживание состояния плеера для трансляций, подобно тому, как это делается на Twitch.

Ошибка Uncaught Error: iframe src is not a VK embed возникает потому, что VK.VideoPlayer распознаёт только официальные встраиваемые URL (например, video_ext.php?...&js_api=1), а https://live.vkvideo.ru/... — другой хост и другой шаблон embed. Для VOD (video_ext.php) можно инициализировать VK.VideoPlayer и подписаться на vk события (play, pause, ended, timeupdate) через vk api javascript; для live‑трансляций на live.vkvideo.ru официальной поддержки событий нет — придётся использовать обходные пути: прямой HLS + внешний плеер (hls.js/video.js), серверный мониторинг манифеста или неофициальные API (с риском и ограничениями).


Содержание


VK.VideoPlayer и vk события — почему ваш код падает

Коротко: скрипт https://vk.com/js/api/videoplayer.js проверяет src iframe и допускает только поддерживаемые шаблоны embed (обычно https://vk.com/video_ext.php?...&js_api=1). Если iframe ссылается на другой домен или другой формат (например, https://live.vkvideo.ru/...), инициализация бросит iframe src is not a VK embed. Это подтверждается в официальной документации и исходнике плеера — см. VK Developer Documentation и сам скрипт https://vk.com/js/api/videoplayer.js.

Почему это важно? Потому что для управления и получения событий плеер и API должны договориться по протоколу (обычно через postMessage). Если рукопожатия нет — нет и событий. На практике для VOD‑встраивания (video_ext.php) это работает: можно создать экземпляр VK.VideoPlayer(iframe) и получить методы/события. Но для трансляций на отдельной платформе — часто другой плеер, другие правила, и события ended и т.п. могут отсутствовать или никогда не вызываться (видео считается «вечным»). См. практические обсуждения на StackOverflow на русском.


Корректное встраивание VOD (video_ext.php + js_api=1)

Если задача — отслеживать события через VK.VideoPlayer, используйте официальную встраиваемую ссылку вида https://vk.com/video_ext.php?...&js_api=1. Обычно её можно получить через кнопку “Embed” в публикации ВК или из HTML кода поста.

Пример минимальной разметки для VOD:

html
<iframe
 id="vkPlayer"
 src="https://vk.com/video_ext.php?oid=-12345&id=67890&hash=...&js_api=1"
 allow="autoplay;encrypted-media;fullscreen;picture-in-picture"
 allowfullscreen>
</iframe>

<script src="https://vk.com/js/api/videoplayer.js"></script>
<script>
document.getElementById('vkPlayer').addEventListener('load', () => {
 try {
 const player = VK.VideoPlayer(document.getElementById('vkPlayer'));
 console.log('VK player ready:', player);
 // далее — подписка на события (см. далее)
 } catch (err) {
 console.error(err.message);
 }
});
</script>

Нюансы:

  • Скрипт https://vk.com/js/api/videoplayer.js должен загрузиться до вызова VK.VideoPlayer (или вызывать инициализацию в обработчике onload этого скрипта).
  • Если видео приватное/требует авторизации — плеер может не инициализироваться.
  • После инициализации объект плеера содержит набор методов и событий (в разных версиях API названия методов могут отличаться) — посмотрите console.dir(player) в DevTools, чтобы увидеть доступные API.

Подробнее о привычном VOD‑паттерне — в официальной документации: VK Developer Documentation и примерах сообщества: qna.habr.com.


Примеры кода: подписка на события плеера в JavaScript (play/pause/ended)

API у разных версий плеера может немного отличаться, потому универсальный приём — сначала инспектировать объект, затем подписаться на доступные методы. Пример «безопасной» подписки, которая проверяет несколько вариантов API:

javascript
function subscribeEvent(player, evt, handler) {
 if (!player) return;
 if (typeof player.on === 'function') {
 player.on(evt, handler); // часто встречается
 } else if (typeof player.addEventListener === 'function') {
 player.addEventListener(evt, handler);
 } else if (typeof player.bind === 'function') {
 player.bind(evt, handler);
 } else {
 console.warn('No event API found on VK player — will attempt polling', evt);
 }
}

// Пример использования (после успешной инициализации VK.VideoPlayer)
subscribeEvent(player, 'play', () => console.log('play'));
subscribeEvent(player, 'pause', () => console.log('pause'));
subscribeEvent(player, 'ended', () => console.log('ended'));
subscribeEvent(player, 'timeupdate', (t) => console.log('time', t));

Если событий нет или API ограничен — используйте fallback: короткий polling (раз в 1–2 с) с проверкой доступных методов у объекта:

javascript
// Polling-safe пример
let lastTime = 0;
const poll = setInterval(() => {
 if (!player) return;
 if (typeof player.getCurrentTime === 'function') {
 const t = player.getCurrentTime();
 if (t !== lastTime) {
 // проигрывание идёт
 lastTime = t;
 }
 } else if ('currentTime' in player) {
 const t = player.currentTime;
 if (t !== lastTime) lastTime = t;
 } else {
 // нет API - остановить polling или перейти к серверному подходу
 clearInterval(poll);
 }
}, 1000);

Но помните: доступ к свойствам iframe‑вложенного DOM запрещён из-за CORS — polling тут возможен только если API плеера предоставляет методы (postMessage) или если вы используете свой собственный video элемент (см. HLS ниже).

Если вы можете получить прямой поток (MP4/HLS), то лучший и самый надёжный путь — подключить внешний плеер (hls.js / video.js) и подписываться на стандартные события HTMLMediaElement (playing, pause, ended) — пример ниже в разделе Обходы.


Почему live.vkvideo.ru не распознаётся — ограничения для vk live stream

Причины, почему ваш код с https://live.vkvideo.ru/app/embed/...&js_api=1 не работает:

  • другой домен и другой шаблон embed — официальный VK.VideoPlayer ожидает vk.com/video_ext.php (проверка в коде плеера), поэтому он бросает iframe src is not a VK embed (см. vk.com/js/api/videoplayer.js);
  • live‑плеер может реализован совсем иначе (специализированный player на live.vkvideo.ru) и не поддерживает js_api handshake;
  • трансляции по сути «поточные» и окончание трансляции может не отражаться событием ended у плеера — платформа может просто перестать выдавать сегменты или показывать оффлайн страницу; обсуждение таких ограничений — на StackOverflow RU и в описании live‑платформы live.vkvideo.ru.

Что это значит практично? Нельзя заставить VK.VideoPlayer работать с iframe, который он не распознаёт. Нельзя надеяться, что play/ended будут приходить, если плеер на стороне сервиса не передаёт эти события.


Обходные варианты для отслеживания старта/остановки трансляции (HLS, серверный мониторинг, неофициальные API)

Если нельзя использовать VK.VideoPlayer для live.vkvideo.ru — есть рабочие альтернативы. Выбор зависит от доступа к прямым потокам и от требований к надёжности.

  1. Подключить прямой HLS (m3u8) к внешнему плееру (рекомендуется, если у вас есть URL m3u8)
  • Используйте hls.js / video.js: вы получите стандартные события медиаплеера. Пример:
html
<video id="hlsPlayer" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
const video = document.getElementById('hlsPlayer');
const url = 'https://cdn.example.com/live/stream/playlist.m3u8'; // ваш HLS manifest
if (Hls.isSupported()) {
 const hls = new Hls();
 hls.loadSource(url);
 hls.attachMedia(video);
 video.addEventListener('playing', () => console.log('stream playing'));
 video.addEventListener('pause', () => console.log('paused'));
 video.addEventListener('ended', () => console.log('ended'));
} else {
 video.src = url; // нативный HLS в Safari
}
</script>
  • Минусы: нужен прямой доступ к manifest (CORS) и стабильный URL.
  1. Серверный мониторинг манифеста (надежно для оповещений)
  • Сервер опрашивает HLS manifest (или RTMP ingest/статус) и решает, онлайн ли поток. Затем оповещает клиентов через WebSocket/SSE/webhook. Это обходной, надёжный путь, работает независимо от возможностей embed. Пример Node.js‑логики:
javascript
const axios = require('axios');
setInterval(async () => {
 try {
 const res = await axios.get('https://cdn.example.com/live/stream/playlist.m3u8', { timeout: 5000 });
 const data = res.data;
 const isLive = data.includes('#EXTINF') && !data.includes('#EXT-X-ENDLIST');
 // если состояние изменилось — уведомить клиентов
 } catch (e) {
 // 404/timeout => возможно offline
 }
}, 15000);
  • Минусы: нужно серверное место, возможны ограничения доступа к CDN (авторизация/CORS).
  1. Неформальные/неофициальные API и парсинг страницы
  • Есть проекты в сообществе, которые пытаются получить метаданные трансляций у vkplay.live — например unofficial-vk-play-live-api. Но они нестабильны и могут нарушать правила — используйте с осторожностью.
  • Для быстрых решений иногда парсят страницу трансляции или используют streamlink/CLI (см. обсуждение streamlink issue). Минус: ненадёжно и может быть запрещено правилами сервиса.
  1. Запросить официальные webhooks / API (если доступны)
  • Иногда платформа предоставляет серверные уведомления о старте/остановке — стоит проверить документацию платформы или обратиться в поддержку.

Итог: если вы не можете получить прямой поток — лучшая схема для надёжности: серверный мониторинг + нотификации клиентам. Если есть прямой m3u8 — используйте hls.js и стандартные события HTMLMediaElement.


Отладка: ошибка “iframe src is not a VK embed” — чеклист

Быстрая проверка — пройдите этот чеклист по порядку:

  • Проверьте src iframe — он должен быть https://vk.com/video_ext.php?...&js_api=1. Если нет — замените на корректный embed (получите код в ВК).
  • Проверьте наличие параметра js_api=1 в URL — без него скрипт не активирует JS API.
  • Убедитесь, что <script src="https://vk.com/js/api/videoplayer.js"></script> загружен ДО вызова VK.VideoPlayer (или инициализация выполняется в onload скрипта/iframe).
  • Подождите загрузки iframe (iframe.addEventListener('load', ...)) — инициализируйте внутри обработчика.
  • Посмотрите в консоль: console.dir(VK) и console.dir(player) — это покажет доступные методы/события.
  • Если видео приватное/под авторизацией — проверьте, виден ли embed в режиме инкогнито.
  • Если нужен мониторинг live — подумайте о серверном опросе manifest (см. выше).
  • Примеры и объяснения ошибок ищите в обсуждениях: StackOverflow RU и в официальной документации VK Widgets — Video.

Если после всех проверок проблема остаётся — пришлите точный iframe src (можно без hash) и скрин консоли — помогу с конкретикой.


Источники


Заключение

Коротко: ваш текущий iframe с live.vkvideo.ru не совместим с VK.VideoPlayer — отсюда ошибка iframe src is not a VK embed. Если цель — отслеживать vk события через VK.VideoPlayer, используйте video_ext.php?...&js_api=1 (VOD). Для live‑трансляций надежнее получить прямой поток (HLS) и подключить hls.js/video.js или реализовать серверный мониторинг manifest (оповещения через WebSocket/SSE). Нужна помощь с конкретной реализацией (например, пример на hls.js + серверный poll для m3u8 или готовый серверный webhook)? Могу подготовить рабочий пример под ваш кейс.

Авторы
Проверено модерацией
НейроОтветы
Модерация
Как получить события VK.VideoPlayer в JavaScript для live