Как скачать DASH- или MPD-видео в Chrome
Скачать DASH-видео, просто сохранив его .mpd-файл, нельзя. Этот файл – манифест: небольшой XML-документ, который описывает видео и подсказывает плееру, где лежат его части. Сохраните его – и получите текст. Чтобы получить видео, нужно загрузить части, на которые манифест ссылается, выбрать из них нужные и собрать в один файл, который откроет обычный плеер.
В Chrome разумный порядок такой:
- Если у публикатора есть собственная кнопка загрузки, используйте её.
- Если поток поддерживается и не защищён, воспользуйтесь инструментом, который понимает DASH. MAX Video Downloader находит DASH на странице, даёт выбрать качество и сам работает с отдельными аудио- и видеодорожками.
- Если поток защищён – остановитесь. Защищённую DRM презентацию не открывает никакой приём скачивания, и обходить защиту это руководство не учит.
Дальше – для тех, кто хочет понять причины и определить, в какой из этих ситуаций он оказался.
Что на самом деле внутри MPD
DASH (Dynamic Adaptive Streaming over HTTP, он же MPEG-DASH) – технология адаптивной потоковой передачи. Медиа нарезается на короткие сегменты, которые отдаются по обычному HTTP, а один и тот же контент предлагается в нескольких качествах, чтобы плеер мог переключаться вслед за скоростью соединения. MPD (Media Presentation Description) – документ, который перечисляет эти ресурсы. Как сказано в документации dash-mpd-cli, DASH-клиент по манифесту решает, какие ресурсы запрашивать.
Сильно упрощённый пример, написанный для иллюстрации, а не скопированный с настоящего сервиса:
<MPD type="static" mediaPresentationDuration="PT10M">
<Period>
<AdaptationSet contentType="video">
<SegmentTemplate initialization="video/$RepresentationID$/init.mp4"
media="video/$RepresentationID$/seg-$Number$.m4s"
startNumber="1" duration="4" timescale="1" />
<Representation id="v1" width="1280" height="720" bandwidth="2500000" codecs="avc1.4d401f" />
<Representation id="v2" width="1920" height="1080" bandwidth="5000000" codecs="avc1.640028" />
</AdaptationSet>
<AdaptationSet contentType="audio" lang="en">
<SegmentTemplate initialization="audio/$RepresentationID$/init.mp4"
media="audio/$RepresentationID$/seg-$Number$.m4s"
startNumber="1" duration="4" timescale="1" />
<Representation id="a1" bandwidth="128000" codecs="mp4a.40.2" />
</AdaptationSet>
</Period>
</MPD>
Это упрощённый набросок, а не манифест реального сервиса. Настоящие манифесты длиннее, но собраны из тех же частей. SegmentTemplate – шаблон адреса: клиент подставляет вместо $RepresentationID$ и $Number$ нужные значения и получает адрес каждого сегмента.
- Period – отрезок презентации. У многих файлов он один; бывает и несколько, например когда вставлена реклама или другая часть.
- AdaptationSet объединяет взаимозаменяемые версии одного вида контента: видео, аудио на одном языке, дорожку субтитров.
- Representation – одна конкретная версия внутри группы: это разрешение с этим битрейтом и этим кодеком.
- Каждый Representation сообщает, как найти его сегменты: либо перечисляет их, либо описывает шаблон URL, который клиент заполняет сам.
Для скачивания отсюда следуют два вывода. Во-первых, в манифесте нет единого «самого видео», есть выбор между представлениями. Во-вторых, ничто не говорит, что видео и звук лежат в одном месте. В примере выше – не лежат.
Стоит взглянуть и на атрибут type. static описывает конечную презентацию по запросу. dynamic означает манифест, который постоянно обновляется, – так описываются прямые трансляции. Это более трудный случай, к нему мы вернёмся ниже.
Почему скачанное видео может оказаться без звука
DASH обычно упаковывает звук в отдельное представление, а не повторяет его в каждом качестве видео, поэтому видеодорожки могут содержать только картинку. Это одна из возможных причин файла без звука, но не единственная. В руководстве Mozilla по подготовке материалов для Media Source Extensions результат DASH-упаковки показан как stream.mpd рядом с отдельными папками audio и video и несколькими пронумерованными качествами видео.
Браузер воспроизводит обе дорожки одновременно, поэтому на странице всё выглядит нормально. Если загрузчик возьмёт только видеопредставление максимального качества, вы получите идеальную картинку без звука. Ничего не сломалось: сохранено ровно то, что выбрано.
Субтитры могут описываться так же – ещё одним AdaptationSet. Поэтому полная загрузка означает выбор как минимум одного видео- и одного аудиопредставления плюс нужных субтитров и их объединение.
Загрузка, склейка и отсутствие перекодирования
Превращение манифеста в файл состоит из нескольких разных шагов, и полезно не смешивать их:
- Выбор. По одному представлению каждого вида: качество видео, язык звука.
- Загрузка. По порядку запрашиваются сегменты выбранных представлений. Сначала – инициализационные данные, если они нужны.
- Муксинг. Видео и звук помещаются в один контейнер, например MP4 или MKV. dash-mpd-cli описывает ту же последовательность: выбрать вариант с подходящей кодировкой, загрузить сегменты по HTTP и смуксировать аудио и видео.
Муксинг – это не конвертация. Если кодеки подходят для целевого контейнера, закодированные данные можно переложить в новый контейнер без декодирования и повторного кодирования – это быстро и не снижает качества. Перекодирование нужно, только когда кодеки нельзя совместить как есть. MAX по возможности копирует потоки без перекодирования, а если выбранные дорожки не помещаются в один контейнер, автоматически переключается на подходящий. Разницу между remux и transcode подробнее разбирает руководство по HLS, и большая часть сказанного там верна и для DASH.
Как скачать DASH-поток в Chrome
Сначала проверьте возможности публикатора
Если видео ваше или вам дали к нему доступ, платформа может предлагать собственную загрузку в личном кабинете или админке. Так вы получите исходный файл без какой-либо реконструкции. Это и правильный путь, если сервис не разрешает сохранение: что бы ни делал инструмент, это не изменится.
Инструмент, который читает манифест за вас
MAX работает со страницы, на которой видео уже воспроизводится:
- Установите MAX из Chrome Web Store (бесплатно).
- Откройте страницу и запустите видео, чтобы плеер запросил манифест и сегменты.
- Откройте всплывающее окно MAX. Рядом с найденным видео показаны значки обнаруженных потоков, так что до загрузки можно убедиться, что звуковой поток есть.
- Выберите качество и скачайте.
MAX видит только те медиа, которые страница реально загрузила – ровно то же, что вы искали бы в DevTools. Поэтому до начала воспроизведения окно может быть пустым. Обычно помогает сначала нажать play или воспользоваться Force Detection. MAX работает прямо в Chrome; необязательное десктопное приложение добавляет нативную обработку FFmpeg и пригодится для тяжёлых и долгих загрузок.
MAX поддерживает DASH (.mpd) с отдельными аудио- и видеодорожками, если медиа не защищено DRM, но это не гарантия для любого потока. Некоторые DASH-структуры, например сложная вложенность индексов сегментов, перечислены в FAQ как неподдерживаемые, а намеренно «сломанный» сайтом манифест починить нельзя.
Если хотите увидеть манифест сами
Откройте DevTools, вкладку Network, отфильтруйте по mpd и запустите воспроизведение. Ответ, который начинается с <MPD, – это манифест, обычно он отдаётся как application/dash+xml. По нему видно, какие качества, языки и кодеки предлагаются, – полезно, когда нужно выбирать между двумя неудачными попытками. Но это не рецепт для командной строки: URL сегментов часто зависят от подписанных параметров, cookie и другого, что отправляла сессия браузера, поэтому запрос, повторённый в другом месте, могут отклонить.
Что означает каждый исход
| Что вы видите | Что это обычно значит | Что делать |
|---|---|---|
Сохранился маленький .mpd-файл |
Вы сохранили манифест, а не медиа, которые он описывает. | Используйте инструмент с поддержкой DASH, который загружает и объединяет сегменты. |
| Картинка есть, звука нет | Одна из возможных причин: сохранено только видеопредставление, а звук – отдельная дорожка. | Выберите и аудиодорожку либо сохраните звук отдельно и подключите его как внешнюю дорожку. |
| Файл открывается, но звука нет, хотя аудиодорожка выбрана | Кодеки аудио и видео, возможно, нельзя совместить в выбранном контейнере без конвертации, либо манифест описал их неточно. | Позвольте инструменту выбрать совместимый контейнер, например MKV, или извлеките звук отдельным файлом. |
.mpd открывается как XML, но запросы медиа возвращают 403 |
Ссылки на сегменты могли устареть либо зависят от сессии в браузере. | Перезагрузите страницу, запустите воспроизведение и снова найдите видео, пока ссылки свежие. Если не помогает – доступ, возможно, ограничен. |
| Загрузка сразу завершается ошибкой | Неподдерживаемая структура, защищённый контент, сломанный манифест или нет места на диске. | Прежде чем повторять, посмотрите сведения об ошибке в истории загрузок. |
В манифесте есть записи ContentProtection |
Контент зашифрован или защищён. Дескриптор с названием DRM-системы, например Widevine или PlayReady, означает DRM. | Остановитесь. MAX не поддерживает защищённые DRM медиа, и обходить защиту не нужно. Используйте то, что предлагает сервис. |
В манифесте type="dynamic" |
Это прямая трансляция или повтор, который ещё публикуется. | Записывайте, пока трансляция идёт: сегменты, вышедшие из окна трансляции, позже получить нельзя. |
Две строки таблицы заслуживают отдельного пояснения.
Защита. Элемент ContentProtection в манифесте сигнализирует, что часть контента защищена или зашифрована. Какая именно схема, зависит от дескриптора: schemeIdUri и его содержимое указывают на общую схему шифрования или конкретную DRM-систему, так что прочтите их, прежде чем делать выводы. Некоторые инструменты умеют расшифровывать контент, если передать им ключи, и в документации dash-mpd-cli об этом сказано прямо, но получение таких ключей у защищённого сервиса – как раз то, что здесь за границей допустимого. Рекомендации DASH-IF по совместимости выделяют защиту контента в отдельную область наряду с частями про контент по запросу, прямой эфир, видео, аудио и текст, и это соответствует практике: это самостоятельная система, и обычная загрузка по манифесту её не затрагивает.
Живые манифесты. Динамический манифест постоянно публикует новые сегменты, поэтому загрузка должна следовать за ним по мере роста. Это другая задача, чем сохранение готового файла. По словам авторов dash-mpd-cli, поддержка живых манифестов у них ограничена: утилита не реализует тайминг по часам, нужный, чтобы загружать сегменты только по мере их появления. Это ограничение одного инструмента, а не правило для всех, но оно показывает, почему прямой DASH-эфир – иная задача, чем поток по запросу. MAX может записывать поддерживаемые прямые трансляции, пока они идут.
Считайте .mpd подсказкой, а не разрешением
Найденный MPD говорит лишь о том, как плеер получает видео. Он не говорит, что сегменты общедоступны, полны или что вы вправе их сохранить. Если сервис предлагает загрузку – пользуйтесь ею. Если поток защищён или доступ зависит от входа в аккаунт, которым инструмент воспользоваться не может, честного обходного пути нет.
А вот для незащищённого поддерживаемого потока, который вам можно сохранить, ответ короткий. Дайте странице загрузить его, выберите качество, убедитесь, что звук включён, и пусть инструмент сам загрузит и смуксирует.