Как работают все эти услуги «Сохранить видео с YouTube»?

Я имею в виду, как они работают, в общем? Как они получают ссылку на сам видеопоток (а не только на страницу, содержащую Flash-плеер)?

Я сделал поиск в Интернете, но не нашел ничего полезного (все ссылки указывают на такие службы, но никто из них не говорит, как они фактически реализованы).

Существует очень популярный загрузчик командной строки с открытым исходным кодом, называемый youtube-dl , который делает именно это. Он захватывает фактические ссылки на видео и аудио файлы с данной ссылки YouTube – или на любой другой популярный веб-сайт, например Vimeo, Yahoo! Видео, uStream и т. Д.

Чтобы узнать, как это сделать, загляните в экстрактор YouTube . Это слишком много, чтобы показать здесь. Другие экстракторы существуют для более простых сайтов . У Стивена Пенни есть простой JavaScript-загрузчик для YouTube, что немного более просто.

Но в основном, для Flash-видеоплеера он должен быть инициализирован и настроен через некоторый JavaScript. Проще говоря, проигрыватель Flash-объекта получит URL-адрес загружаемого видеопотока.

Чтобы найти видеопоток, вам нужно проанализировать HTML и JS-код видеостраницы, чтобы найти соответствующий код инициализации, а затем попытаться найти ссылку на фактический файл MP4. Он может быть в открытом виде, но он также может быть сгенерирован «на лету» с некоторыми конкретными токенами загрузки. Часто JavaScript запутан, чтобы усложнить его повторную инженерию. Или видеоинформация может содержаться в XML-файле, который асинхронно загружается JS.

Для прогрессивного скачивания видео в формате HTML5 фактический исходный файл обычно упоминается непосредственно в source дочернем video видеотега, поэтому, если вы будете искать страницу для mp4 или аналогичного. Например, на немецком новостном шоу Tagesschau 100 вы найдете:

 <source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4"> 

Для более продвинутых технологий воспроизведения, таких как MPEG DASH или HTTP Live Streaming (HLS) от Apple, вам необходимо проанализировать метаинформационный файл, чтобы получить фактический видеопоток. Мета файл ( .mpd например, в DASH и .m3u8 для HLS) будет содержать ссылки на сегменты видео и аудио, которые позже вам нужно будет объединить, чтобы получить воспроизводимый файл.

Для этого нет общего решения. Это требует тщательной проверки и отладки целевого сайта.

Закладка YouTube

Так я сделал это с помощью JavaScript

Начните с объекта ytplayer.config.args . Это содержит все URL-адреса для видео. Он разбит на

 url_encoded_fmt_stream_map // traditional: contains video and audio stream adaptive_fmts // DASH: contains video or audio stream 

Каждый из них представляет собой массив, разделенный запятыми, который я бы назвал «потоковыми объектами». Каждый «объект потока» будет содержать такие значения, как это

 url // direct HTTP link to a video itag // code specifying the quality s // signature, security measure to counter downloading 

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

У YouTube есть как минимум 3 уровня безопасности для своих видео

 unsecured // as expected, you can download these with just the unencoded URL s // see below RTMPE // uses "rtmpe://" protocol, no known method for these 

Видеоролики RTMPE обычно используются на официальных полнометражных фильмах и защищены с помощью SWF Verification Type 2. Это происходит с 2011 года и еще не реконструировано.

Видеоролики типа «s» являются самыми сложными, которые действительно могут быть загружены. Вы, как правило, видите это на видео VEVO и тому подобное. Они начинаются с подписи, такой как

 AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5 

Затем подпись скремблируется с помощью такой функции

 function mo(a) { a = a.split(""); a = lo.rw(a, 1); a = lo.rw(a, 32); a = lo.IC(a, 1); a = lo.wS(a, 77); a = lo.IC(a, 3); a = lo.wS(a, 77); a = lo.IC(a, 3); a = lo.wS(a, 44); return a.join("") } 

Эта функция динамична, она обычно меняется каждый день. Чтобы сделать его более сложным, функция размещается по URL-адресу, например

 http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js 

Это вводит проблему политики одного происхождения . По сути, вы не можете загрузить этот файл с сайта www.youtube.com потому что это разные домены. Обходной путь этой проблемы – CORS . С помощью CORS s.ytimg.com может добавить этот заголовок

 Access-Control-Allow-Origin: http://www.youtube.com 

И это позволит загрузить JavaScript с сайта www.youtube.com . Конечно, они этого не делают. Обходной путь для этого обходного пути заключается в использовании прокси-сервера CORS. Это прокси-сервер, который отвечает на следующие заголовки ко всем запросам

 Access-Control-Allow-Origin: * 

Итак, теперь, когда вы проксировали свой JS-файл и использовали функцию для скремблирования подписи, вы можете использовать ее в querystring для загрузки видео.

  • Как скачать видео с YouTube с субтитрами?
  • Как остановить людей от загрузки онлайн-видео для офлайн-воспроизведения?
  • Проблема с загрузкой видео YouTube с помощью Free Download Manager
  • Показывать источник видео Youtube в теге HTML5?
  • Как проверить, транслируется ли канал YouTube в прямом эфире
  • Встроенное видео Youtube: функция автозапуска не работает в iphone
  • Как отключить видеоролики YouTube от автоматического воспроизведения?
  • Загрузите YouTube через командную строку
  • Как преобразовать анимированный GIF в формат видео в формате YouTube?
  • Как заблокировать предлагаемые видео Youtube?
  • Код для загрузки видео с Youtube на Java, Android
  • Interesting Posts

    DNS-сервер NETGEAR DGN2200v2 не работает должным образом

    ITextSharp вставляет текст в существующий pdf

    Есть ли поддержка Linux для TRIM на дисках SSD?

    C # Получить позицию элемента управления в форме

    Как обновить запись с помощью Entity Framework 6?

    Адаптеры Powerline TP -Link случайным образом отключаются

    Как я могу воспроизвести онлайн-видео в полноэкранном режиме? И введите текстовый редактор одновременно?

    Как вызвать функцию или процедуру Oracle с помощью Hibernate (EntityManager) или JPA 2

    Смутно о группе Matcher в Java regex

    Отключение жестов касания в Windows 8.1

    Как удалить дополнительное пространство полей, созданное встроенными блоками?

    Как создать проект из существующего источника в Eclipse, а затем найти его?

    Windows 10: Подключите элемент к левой части меню «Пуск»?

    «Реализует Runnable» против «extends Thread»

    Использование специального сервлета автоматического запуска для инициализации при запуске и совместного использования данных приложения

    Давайте будем гением компьютера.