\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/woocommerce-switch-product-cards-by-color-without-variations","name":"Переключение карточек товаров по цвету в WooCommerce без вариаций","position":1,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/woocommerce-switch-product-cards-by-color-without-variations","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/woocommerce-switch-product-cards-by-color-without-variations"},"inLanguage":"ru","dateCreated":"2026-01-17T12:18:49.115Z","datePublished":"2026-01-17T12:18:49.115Z","dateModified":"2026-01-17T12:18:49.115Z","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":"Переключение карточек товаров по цвету в WooCommerce без вариаций","description":"Как реализовать свитчинг карточек товаров при выборе цвета обуви в WooCommerce без вариативных продуктов. Meta-поля, хуки, AJAX и JS для динамического каталога как на маркетплейсах. SEO-дружественный подход с примерами кода.","keywords":["woocommerce","переключение карточек товаров","цвет обуви","без вариативных продуктов","ajax woocommerce","хуки woocommerce","woocommerce товары","цвет товара","вариация woocommerce","woocommerce карточки товара","woocommerce variation"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-horizontal-scroll-mobile-menu","name":"Как запретить горизонтальный скроллинг в мобильном меню","position":2,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-horizontal-scroll-mobile-menu","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-prevent-horizontal-scroll-mobile-menu"},"inLanguage":"ru","dateCreated":"2026-01-24T07:39:07.620Z","datePublished":"2026-01-24T07:39:07.620Z","dateModified":"2026-01-24T07:39:07.620Z","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":"Как запретить горизонтальный скроллинг в мобильном меню","description":"Решения для запрета горизонтальной прокрутки при открытии мобильного меню. CSS overflow-x hidden, body fixed position и JavaScript методы.","keywords":["мобильное меню","горизонтальная прокрутка","overflow hidden","CSS overflow-x","body fixed","burger menu","мобильная версия","CSS решения"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch","name":"setTimeout JavaScript: задержка между SaveData и RunFile","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-settimeout-delay-between-savefile-runbatch"},"inLanguage":"ru","dateCreated":"2026-02-27T15:24:59.934Z","datePublished":"2026-02-27T15:24:59.934Z","dateModified":"2026-02-27T15:24:59.934Z","author":[{"@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":"Илья Кантор — автор, тренер и JavaScript-разработчик, основатель проекта Modern JavaScript Tutorial."},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@learn-javascript-ru","name":"learn.javascript.ru","description":"Бесплатный интерактивный учебник по современному JavaScript с примерами и задачами, охватывающий основы, тонкости и фишки языка и DOM","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@learn-javascript-ru","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/learn-javascript-ru/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Free resource for web developers providing detailed information about web technologies, APIs, and best practices","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/@estet","name":"@estet","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@estet","jobTitle":"Разработчик","description":"Активный участник Stack Overflow на русском с экспертизой в C#, JavaScript, .NET, Delphi; 545 репутации, 9 ответов"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@sega057","name":"Саша Черных","givenName":"Саша","familyName":"Черных","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@sega057","jobTitle":"Разработчик","description":"Участник Stack Overflow на русском с интересом к JavaScript; 21 репутация, 1 ответ"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@autocrab","name":"@autocrab","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@autocrab","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":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexey-golubev","name":"Алексей Голубев","givenName":"Алексей","familyName":"Голубев","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexey-golubev","jobTitle":"Разработчик","description":"Автор примеров кода на CodeNet.ru"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-codenet-ru","name":"CodeNet.ru","description":"Сайт с статьями, исходниками и примерами кода для веб-разработки и программирования","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@www-codenet-ru"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@ionden","name":"Денис Инешин","givenName":"Денис","familyName":"Инешин","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@ionden","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/ionden/avatar.png","width":"72","height":"72"},"jobTitle":"JavaScript разработчик","description":"JavaScript-разработчик в Booking.com, автор open-source проектов на ionden.com, значительный вклад в теги JavaScript, HTML, CSS (3074 ответа, 33% решений)"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@k12th","name":"Константин Китманов","givenName":"Константин","familyName":"Китманов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@k12th","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/k12th/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик","description":"Активный участник Хабр Q&A с вкладом в JavaScript, Node.js, HTML, разработку игр, npm, CSS (1745 ответов, 34% решений)"},{"@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":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@streletz","name":"@streletz","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@streletz","jobTitle":"Разработчик","description":"Участник Stack Overflow на русском"}],"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":"setTimeout JavaScript: задержка между SaveData и RunFile","description":"Как реализовать задержку setTimeout javascript между вызовами функций SaveData() для сохранения файла javascript через ActiveXObject и RunFile() для wscript shell run batch-файла при клике на кнопку. Полный пример кода, альтернативы и отладка для js settimeout.","keywords":["settimeout","settimeout javascript","js settimeout","файл javascript","javascript сохранить файл","wscript shell","wscript shell run","activexobject","settimeout задержка"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang","name":"Servicepipe JS сканирует localhost и зависает с Kaspersky","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/servicepipe-js-localhost-scan-kaspersky-hang"},"inLanguage":"ru","dateCreated":"2026-01-04T06:28:01.095Z","datePublished":"2026-01-04T06:28:01.095Z","dateModified":"2026-01-04T06:35:14.269Z","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":"Servicepipe JS сканирует localhost и зависает с Kaspersky","description":"Почему скрипт Servicepipe.ru сканирует localhost (RDP, VNC), вызывает зависание сайта и ошибки с Kaspersky Endpoint Security? Легитимная DDoS защита или угроза? Анализ обфусцированного JS, диагностика конфликта, меры блокировки CSP и uBlock.","keywords":["kaspersky endpoint security","servicepipe","сканирование localhost","защита от ddos","обфусцированный javascript","локальные порты","kaspersky блокировка","ddos cybert","анализ js","csp блокировка","ublock origin","threatmetrix"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page","name":"Tilda: номер заказа на странице Спасибо после оплаты","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-display-order-number-tilda-thank-you-page"},"inLanguage":"ru","dateCreated":"2026-01-02T15:34:47.486Z","datePublished":"2026-01-02T15:34:47.486Z","dateModified":"2026-01-02T15:34:47.486Z","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: номер заказа на странице Спасибо после оплаты","description":"Как вывести номер и состав заказа на странице «Спасибо» в Tilda после оплаты из корзины. Инструкции по tilda javascript, webhook, tilda api и localStorage. Примеры кода, чек-лист и отладка для tilda оплата и tilda корзина.","keywords":["tilda оплата","tilda api","tilda заказы","tilda корзина","tilda webhook","tilda javascript","страница спасибо tilda","tilda переменные"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/jquery-ajax-форма-отправка","name":"Отправка формы через jQuery Ajax без перезагрузки страницы","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/jquery-ajax-форма-отправка","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/jquery-ajax-форма-отправка"},"inLanguage":"ru","dateCreated":"2025-12-09T18:19:40.813Z","datePublished":"2025-12-09T18:19:40.813Z","dateModified":"2025-12-09T18:19:40.813Z","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":"Отправка формы через jQuery Ajax без перезагрузки страницы","description":"Используйте jQuery для перехвата отправки формы, сериализуйте данные и отправьте их через $.ajax на form.php. Предотвратите перенаправление и обработайте ответ.","keywords":["jquery ajax отправка формы","отправка формы без перезагрузки","сериализация данных jQuery","пример jQuery ajax","form.php ajax","обработка ответа ajax","предотвратить перезагрузку","jquery ajax post","ajax обработка формы","jquery ajax без перенаправления"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/problems-loading-site-old-ios-version","name":"Проблемы загрузки сайта на старых iOS: диагностика и решения","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/problems-loading-site-old-ios-version","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/problems-loading-site-old-ios-version"},"inLanguage":"ru","dateCreated":"2026-04-06T13:19:53.054Z","datePublished":"2026-04-06T13:19:53.054Z","dateModified":"2026-04-08T08:01:47.880Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@apple-dev-team","name":"Apple Developer Team","givenName":"Apple","familyName":"Developer Team","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@apple-dev-team","jobTitle":"Команда разработчиков документации","description":"Команда инженеров и технических писателей Apple, ответственных за создание и поддержание документации для разработчиков экосистемы Apple."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexis","name":"Alexis Deveria","givenName":"Alexis","familyName":"Deveria","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@alexis","jobTitle":"Веб-разработчик","description":"Веб-разработчик и создатель сервиса Can I use, специализирующийся на тестировании совместимости веб-технологий и создании инструментов для веб-разработчиков."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-team","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-team","jobTitle":"Технические писатели","description":"Сообщество разработчиков и технических писателей, совместно создающих и поддерживающих документацию веб-технологий на платформе MDN Web Docs."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@react-core","name":"React Team","givenName":"React","familyName":"Team","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@react-core","jobTitle":"Разработчики библиотек","description":"Команда инженеров Facebook (Meta), ответственных за разработку и поддержку React - JavaScript-библиотеки для создания пользовательских интерфейсов."}],"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":"Проблемы загрузки сайта на старых iOS: диагностика и решения","description":"Причины сбоев загрузки Django+React сайта на iOS ниже версии 26. Совместимость mobile safari 537.36, JavaScript/CSS проблемы и решения для старых версий iOS.","keywords":["mobile safari 537.36","старую версию ios","совместимость ios","ios 26 safari","react ios","safari проблемы","старые версии ios iphone","django react","веб-совместимость","ios safari"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/merge-two-arrays-objects-javascript-by-id","name":"Объединение двух массивов объектов в JavaScript по id","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/merge-two-arrays-objects-javascript-by-id","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/merge-two-arrays-objects-javascript-by-id"},"inLanguage":"ru","dateCreated":"2026-02-10T09:26:15.296Z","datePublished":"2026-02-10T09:26:15.296Z","dateModified":"2026-02-11T16:06:05.332Z","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 по id","description":"Эффективные методы объединения двух массивов объектов в JavaScript на основе общего свойства id. Добавление комментариев к цветам с использованием reduce(), Map() и других подходов.","keywords":["javascript массивы","javascript объединить","javascript merge arrays","javascript массив объектов","javascript добавить в массив","javascript объединить объекты","javascript reduce","javascript map","javascript comments","javascript colors","javascript id property"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-change-styles-vk-iframe-elements","name":"Как изменить стили элементов iframe с видео ВКонтакте","position":9,"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/slider-peek-effect-swiper-slick-owl-responsive","name":"Слайдер с эффектом peek: Swiper, Slick, Owl адаптивно","position":10,"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":""}}]}}]}
Веб

Как получить события 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