Получение URL-адреса видео YouTube с помощью `youtube-dl` происходит медленно, без загрузки видео

10

Я хочу получить URL, используя youtube-dl и опцию «simulate» -g, которая не загружает видео.

Поэтому я дал следующую команду:

youtube-dl -g https://www.youtube.com/watch?v=k4JGSAmu4lg

Это дало следующий вывод через 7-8 секунд

https://r20---sn-cvh7zn7d.googlevideo.com/videoplayback?initcwndbps=1113000&mt=1408702970&requiressl=yes&ipbits=0&sver=3&fexp=901454%2C902408%2C919145%2C924626%2C927622%2C927904%2C931330%2C931983%2C934024%2C934030%2C934804%2C945118%2C945308%2C946023%2C951914&ratebypass=yes&signature=38F111D46D72FFC50B47D50B3C9A631099BF5F83.FA134C91F407989B95ACADC1F1F6946B8F18C158&upn=tU0u5t7A2Uw&sparams=id%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Cmm%2Cms%2Cmv%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mm=31&expire=1408724634&id=o-AJNPuDp9TKMKiwzUwvSk76W7JdA0cx0bRSum9mPJJ7Vo&mv=u&source=youtube&ms=au&key=yt5&ip=115.113.1.50&itag=18

Но проблема в том, что запрос URL занимает около 7-8 секунд.
Есть ли способ, чтобы он мог быть быстрее?

бхарат кумар редди боджа
источник
Что именно вы имеете в виду под «симуляцией»?
Фолькер Сигел
когда мы даем опцию -g, за которой следует youtube-dl, она сгенерирует (имитирует) URL, как я упомянул как вывод.
Бхарат Кумар Редди Боджа

Ответы:

9

Время тратить на работу

Команда не зависает и не ждет, что что-то напрасно тратит время,
она действительно работает, что требует времени; Скорее всего, это займет некоторое время, сложив несколько небольших сетевых задержек. Но также может быть, что есть задержки на стороне YouTube, которые складываются.

Это просто время, необходимое для загрузки необходимого HTML-кода;
Команде нужно сделать как минимум два HTTP-запроса, один за другим и, возможно, больше.

Поэтому, если что-то идет медленно, оно уже умножается на количество запросов.

Для меня это занимает 1,5 секунды на очень быстрой линии - это не так уж далеко от 8 секунд.


Как узнать

Я покажу команды, которые я использовал, чтобы узнать:

Чтобы сделать примеры более аккуратными, мы используем переменную для URL:

$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"

Мы хотим измерить продолжительность команд; При использовании команды timeнеобходимо следить за тем, чтобы не перепутать команду и встроенную оболочку. Мы используем небольшую функцию, чтобы сделать строки короче:

$ t(){/usr/bin/time -f 'Time: %es' "$@";}

Ваша команда записывает URL-адрес видеофайла (урезанный до 80 столбцов):

$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823

Давайте измерим время, необходимое для запуска на моем компьютере:

$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s

Хорошо, полторы секунды. Быстрее, чем в вопросе, но не намного быстрее. Но как он проводит время? Может быть, он скачивает видео каким-то скрытым способом и удаляет его? Видео 11 минут в 360p. Простая загрузка без параметров занимает около 13 секунд - в десять раз дольше.
Нужно присмотреться, с подробным вариантом -v:

$ t youtube-dl -v -g "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-g', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?sparams=id%2Cinitcwn
Time: 1.40s

О, есть некоторая задержка, прежде чем строки '[debug]' будут напечатаны. Похоже, youtube-dlтратит время на настройку конфигурации. Это четверть секунды или около того, а не задержка, которую мы ищем. Но что мы можем извлечь из этого, так это то, что youtube-dlсама реализация может быть медленной.
После сообщений ничего не происходит, пока не будет напечатан URL-адрес. Поэтому мы до сих пор не видим интересной части.
Опция -gзаключается в том, чтобы «смоделировать» загрузку видео в том смысле, что она выполняет сложную часть поиска этого полусекретного URL-адреса, печатает его, но затем в конце пропускает фактическую загрузку. Существует аналогичная опция -s, которая не выводит URL, и кажется похожей в противном случае. Давайте предположим, что это достаточно похоже, если это займет примерно столько же времени; Нам нужно это проверить.

$ t youtube-dl -v -s "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-s', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
[youtube] Setting language
[youtube] k4JGSAmu4lg: Downloading webpage
[youtube] k4JGSAmu4lg: Downloading video info webpage
[youtube] k4JGSAmu4lg: Extracting video information
Time: 1.45s

Хорошо, -sзанимает то же время -g, что и заменить их для тестирования.
Более интересно то, что мы получили больше продукции сейчас. И это напечатано с интересным временем: линии печатаются с одинаковой задержкой друг к другу, поэтому кажется, что они о действиях, которые на самом деле занимают время, которое мы ищем.
Из сообщений загружаются как минимум две веб-страницы. Но мы можем предположить, что слово «страница» не будет означать один HTTP-запрос и один HTML-документ.

Что мы узнали?

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

Если вы сделаете свое интернет-соединение быстрее, чтобы оно могло передавать данные с удвоенной скоростью - это не помогло бы вообще. Но если вы можете получить лучшие pingвремена, это сделает это намного быстрее.
Однако речь идет не о том, чтобы «пинговать» своего провайдера интернет-услуг; Время пинга до YouTube - это то, что имеет значение - и может быть невозможно изменить.

Интересно, что на следующем шаге, при загрузке видео, требования к быстрой линии абсолютно противоположны: задержка вообще не актуальна, а пропускная способность действительно имеет значение.


Еще не устал?

Хотите узнать подробности, на что действительно тратится время?
Следующим шагом будет отслеживание HTTP-соединения; Я подозреваю, что он может показать гораздо больше циклических переходов, чем два, например, для перенаправлений. Вы можете использовать wiresharkили протокол HTTP-прокси, или straceпросто подсчитать системные вызовы для подключения или записи.

На сегодняшний день мы оба достаточно глубоко заглянули в кроличью нору сетей.

Volker Siegel
источник
Итак, что может быть причиной такого долгого времени? Это связано с медленным сетевым подключением?
Бхарат Кумар Редди Боджа
Зависит от того, насколько медленно это - в чем вопрос? Подождите минутку для подробностей моих примеров, я пишу их.
Фолькер Сигел
Мой вопрос: задержка связана с медленным сетевым подключением?
Бхарат Кумар Редди Боджа
Да частично. Вопрос не так прост, как кажется;) Дело не в пропускной способности соединения. Задержка важна здесь. Из того, что я могу сказать, есть по крайней мере три обхода HTTP - но возможно больше. Все задержки умножаются на это число, которое складывается. Я ничего не знаю о вашей связи; Это может быть медленным на конце YouTube, трудно сказать без измерения. Попробуйте другие вещи в сети, для которых вы знаете, как быстро они, и проверьте, чувствует ли это медленнее, или нормально.
Фолькер Сигел
Итак, я добавил некоторые детали :)
Volker Siegel
6

Просто сделайте:

youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=k4JGSAmu4lg' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'

Источник

тик-так
источник
1

Может быть другая причина. youtube-dlраспространяется в виде zip-приложения Python. Каждый раз, когда вы запускаете его, он извлекает и запускает его.

Вы можете вручную извлечь его с помощью unzipкоманды. Тогда беги, __main__.pyкак беги youtube-dl. На маломощном компьютере, таком как Pi, это заметно повысит вашу производительность.

nmrugg
источник