Блог / Руководство

Как скачать встроенное видео в Chrome

Как скачать встроенное видео в Chrome

Можно ли скачать встроенное видео в Chrome, зависит от двух разных вещей: есть ли у вас право его сохранять и что страница на самом деле загружает для воспроизведения. Первое – вопрос разрешения. Второе – вопрос устройства плеера, и именно из-за него правый клик так часто ничего не даёт.

Сначала разберём то, что предлагает сам сайт, потом – что происходит под капотом плеера, как это увидеть в DevTools и когда расширение избавляет от ручной работы.

Почему у плеера нет пункта «Сохранить видео»

«Встроенное» описывает лишь то, где видео показано: на странице, часто в плеере с другого сайта внутри iframe. Как именно медиа попадает в браузер, из этого не следует.

Чаще всего встречаются три схемы доставки:

  • Один файл. Элемент <video> указывает на один MP4 или WebM – напрямую или через <source>, как описывает стандарт HTML. Браузер может запрашивать его кусками через HTTP range-запросы (это обычно для перемотки), но на сервере это по-прежнему один файл.
  • Плейлист из коротких сегментов. HLS и DASH режут видео (и часто звук) на множество небольших файлов, которые описаны манифестом, чтобы качество подстраивалось под соединение. Устройство плейлистов и сегментов разобрано в статье Как скачать M3U8 / HLS-видео в Chrome.
  • Данные, которые собирает JavaScript. Плеер может сам получать данные и передавать их браузеру через Media Source Extensions или создавать Blob в памяти. В обоих случаях у элемента <video> в итоге оказывается адрес blob:.

Именно на этом адресе люди обычно застревают, и его легко истолковать неверно. blob: – это ссылка на объект, который существует внутри вашей вкладки. Он говорит, что страница создала данные локально, но не говорит, что это за данные. Это может быть сегментированный поток HLS или DASH, переданный через Media Source Extensions, а может быть и целый файл, который страница сначала скачала и завернула в Blob. Обратиться к blob:-адресу снаружи вкладки нельзя, поэтому полезный вопрос другой: что страница запрашивала до того, как его создала.

Шифрованное воспроизведение через Encrypted Media Extensions – отдельный слой, который может накладываться на любую из этих схем. Контент расшифровывается только внутри плеера браузера; это намеренная защита, а не «забытая кнопка».

Начните с того, что предлагает сайт

Прежде чем лезть в технические детали, поищите официальный путь. Это единственный способ, который не зависит от устройства плеера.

  • Ссылка или кнопка Скачать рядом с плеером, в меню с тремя точками или в настройках плеера.
  • Возможность скачать в личном кабинете платформы, если видео ваше или вам выдан доступ. Она часто есть на платформах курсов, в панелях видеохостингов и в сервисах вебинаров.
  • Официальный офлайн-режим в приложении сервиса.
  • Если страница ваша – исходный файл, который вы загружали.

Файл, отданный таким способом, – обычная загрузка Chrome, и он появится в списке загрузок. Если такой опции нет, спросите владельца: авторы видео нередко охотно присылают файл.

Здесь же стоит определиться с разрешением. Возможность сохранить видео не означает, что его можно хранить и использовать: например, в США, как поясняет Бюро авторских прав, воспроизведением произведения распоряжается его владелец, а правила сайта добавляют свои ограничения. Свои загрузки, материалы с открытой лицензией и разрешённые личные копии – нормально; платные курсы и чужие работы – как правило, нет. Всё дальнейшее исходит из того, что вы относитесь к первой группе, и ничего из этого не про обход входа, платного доступа или защиты.

Посмотрите, что страница на самом деле загружает

Если кнопки скачивания нет, самое полезное – выяснить, какая из трёх схем перед вами. Это показывает Chrome DevTools, и от этого зависит всё остальное.

  1. Откройте страницу, затем DevTools (F12 или Cmd+Option+I на Mac) и перейдите на вкладку Network.
  2. Включите Preserve log и перезагрузите страницу при открытых DevTools. Запросы, сделанные до их открытия, в журнале не появятся.
  3. Запустите видео и дайте ему поиграть несколько секунд.
  4. Сбросьте фильтр и смотрите на все запросы, а не только на кнопку Media. Фильтры по типу ресурсов в Chrome группируют запросы по тому, как страница их сделала. Обычный файл из <video> чаще всего попадает в Media, но если плеер получает данные через JavaScript, они окажутся в Fetch/XHR. Поэтому при фильтре только по Media можно решить, что загруженное видео вообще ничего не загружало.
  5. Отсортируйте по Size или используйте фильтры вроде mime-type:video/mp4 и larger-than:1M, чтобы самые тяжёлые запросы оказались сверху, и откройте любой из них, чтобы увидеть заголовки и ответ.

Не полагайтесь на расширение файла. В URL могут быть токены и параметры, расширения может не быть вовсе, а может быть и обманчивое. Надёжнее смотреть на Content-Type ответа, на количество запросов и на то, что на самом деле находится в теле ответа.

Три картины, которые вы можете увидеть

Ниже – иллюстративные схемы, а не записи с конкретного сайта. На реальных сайтах всё варьируется, но эти формы стоит узнавать.

A. Один тяжёлый запрос: прямой файл. Вы видите один запрос или несколько повторов одного URL с большим объёмом передачи, Content-Type вроде video/mp4 или video/webm и нередко статус 206 Partial Content с заголовками Accept-Ranges и Content-Range. 206 означает лишь, что браузер запрашивает диапазоны байтов, чтобы можно было перематывать, не скачивая всё целиком. Это один обычный файл. Если он общедоступен и вам разрешено его хранить, откройте адрес запроса в отдельной вкладке и выберите Сохранить видео как…. Если вне страницы адрес перестаёт работать, значит, он зависит от того, что подставляет страница (сессия или подписанный токен), и лучше вернуться к официальному пути, а не копировать эти данные куда-то ещё.

B. Много мелких запросов и манифест: потоковый плейлист. Вы видите один небольшой текстовый запрос, а затем длинную серию похожих запросов, каждый – с несколькими секундами видео. Откройте маленький:

  • Ответ, который начинается с #EXTM3U, – плейлист HLS. Мастер-плейлист перечисляет варианты строками #EXT-X-STREAM-INF, медиаплейлист – сегменты строками #EXTINF. Сервер обычно помечает его как application/vnd.apple.mpegurl или application/x-mpegURL; формат описан в RFC 8216.
  • Ответ, начинающийся с XML-элемента <MPD, – манифест DASH, обычно с типом application/dash+xml.

Повторяющиеся запросы – это сегменты. Обычно они приходят как video/mp2t или video/mp4, а в DASH и в современном HLS звук и видео часто запрашиваются отдельно. Сохранив любой из них, вы получите лишь несколько секунд видео. В зависимости от потока это может быть картинка без звука, только звук или и то и другое вместе, ведь сегмент MPEG-TS может содержать мультиплексированные аудио и видео. В этой схеме ручная работа слишком трудоёмка, и именно здесь расширение оправдывает себя (подробнее ниже).

C. Источник blob: на панели Elements. Выберите видео на вкладке Elements, и вы можете увидеть <video src="blob:https://…">. Сам по себе этот адрес ничего не говорит, поэтому посмотрите журнал Network до его появления:

  • Один крупный запрос video/mp4, а затем blob означает, что страница сначала скачала целый файл и завернула его в Blob. Действует случай A, хотя плеер больше не показывает адрес.
  • Манифест и затем много мелких запросов сегментов означают, что поток собирает плеер на Media Source Extensions. Действует случай B.
  • Если ничего похожего на медиа нет, вывод неоднозначен. Плеер мог загрузиться до начала записи, запрос мог спрятаться в категории, которую вы отфильтровали, или данные приходят в форме, которую из журнала не прочитать. Прежде чем делать выводы, перезагрузите страницу с включённым Preserve log.

Ещё на что стоит посмотреть в манифесте: строка HLS #EXT-X-KEY с методом, отличным от NONE, или элемент DASH ContentProtection указывают, что сегменты зашифрованы или защищены (METHOD=NONE прямо означает, что шифрования нет). Простое шифрование HLS AES-128 – не обязательно DRM, но в FAQ MAX шифрование без доступного ключа названо неподдерживаемым. Записи, называющие систему DRM, например Widevine или FairPlay, означают защищённый поток, и здесь заканчиваются и ручной путь, и путь через расширение.

Пусть читает расширение

Случай A вы разберёте вручную за минуту. В случае B вручную пришлось бы разобрать манифест, выбрать качество, по порядку скачать все сегменты, сопоставить звук с видео и склеить их. Расширение, которое следит за медиазапросами страницы, снимает всё это, и для этого существует MAX Video Downloader.

MAX поддерживает прямые файлы вроде MP4 и WebM, а также потоки HLS (.m3u8) и DASH (.mpd), включая отдельные аудио- и видеодорожки и субтитры, если медиа не защищено DRM. Качество выбираете вы, а базовый сценарий работает в Chrome без необязательного десктопного приложения.

  1. Установите MAX из Chrome Web Store (бесплатно).
  2. Откройте страницу и запустите видео, чтобы оно запросило своё медиа.
  3. Откройте всплывающее окно MAX, выберите найденное видео и качество и скачайте.

MAX видит только то медиа, которое страница уже загрузила – ровно то же, что вы искали в DevTools, поэтому оба способа согласуются. Из этого же следует, что кое-что ему недоступно: в документации сказано, что он не работает на YouTube, с медиа под DRM и на страницах, которые не отдают пригодный источник медиа.

Если MAX ничего не нашёл

Пустое окно – это наблюдение, а не диагноз. Его дают разные ситуации, и действовать в них нужно по-разному:

Что вы видите Что это может значить Что попробовать
Окно пустое, видео не запущено Страница ещё не запросила медиа Запустите видео, снова откройте окно
Окно пустое, видео играет Детектирование не сработало или медиа загрузилось раньше, чем MAX начал следить Обновите страницу, запустите снова, затем попробуйте Force Detection – ограниченную проверку, которая указана в FAQ
Видео найдено, но загрузка сразу падает Найденная ссылка устарела (HTTP 403 после долгого ожидания) либо формат не поддерживается, например DASH со сложной вложенностью индекса или шифрование без ключа Обновите детектирование и повторите; если не помогает, см. раздел об ошибках в FAQ
В журнале Network манифест с указанием DRM Защищённый поток Скачать нельзя; используйте офлайн-режим сервиса
В журнале Network нет ничего похожего на медиа даже после перезагрузки Страница не отдаёт браузеру пригодный источник Спросите владельца

Обновление страницы и Force Detection – быстрая диагностика, а не лекарство: если журнал DevTools показывает защищённый контент или отсутствие источника, повторные попытки ничего не изменят.

Запись экрана: честно о ней

Запись экрана фиксирует воспроизведение, а не файл. Это вариант, когда другого пути нет, а хранить копию вам разрешено. Компромиссы очевидны: запись идёт в реальном времени, качество ограничено настройками захвата, а всё, что есть на экране, попадёт в запись. Защищённое видео часто записывается чёрным, и запись ради обхода защиты это руководство не поддерживает. Правила сайта могут запрещать запись, даже если она технически работает.

Какой способ подходит к какой ситуации

Ситуация С чего начать Реалистичный результат
На сайте есть кнопка или пункт меню для скачивания Использовать его Обычный файл, без инструментов
В Network один крупный запрос video/mp4 или video/webm Открыть URL и выбрать Сохранить видео как… либо расширение Один файл, если адрес доступен вне страницы
Манифест и множество сегментов (HLS/DASH) Расширение вроде MAX Обычно готовый файл выбранного качества, если формат поддерживается и не защищён
Источник blob: Посмотреть в Network, какой это случай на самом деле Зависит от того, что страница загрузила до blob
Манифест с указанием DRM или YouTube Официальный офлайн-режим сервиса Этими способами не скачать
Пригодный источник так и не появляется Спросить владельца Скачивать нечего

Порядок, который экономит больше всего времени: поискать официальный вариант, открыть Network и посмотреть, что загружает страница, и по этому решить, нужна ли вам ссылка на файл, расширение или совсем другой путь. Воспроизводящееся встроенное видео – это ещё не файл, который можно скачать. Так это или нет, зависит от того, что получила страница, и это вы можете прочитать сами.