LINUX.ORG.RU

mpv, youtube-dl и чуть более изощрённая логика выбор формата

 ,


4

3

Наверное, все уже научились смотреть видео из интернета при помощи прекрасной связки mpv и youtube-dl? А теперь давайте решим задачу посложнее!

Какую строчку выбора формата необходимо вписать в mpv.conf, чтобы получаемое видео ОДНОВРЕМЕННО соответствовало обоим критериям:

  • Разрешение по вертикали: 720 или меньше;
  • Видеокодек: не VP9 и не AV1.

Вот строчка, написанная с опорой на самые разнообразные примеры и источники:

ytdl-format='bestvideo[height<=?720][vcodec!=?vp9]+bestaudio/best[height<=?720]'

И она работает так, как и задумано. Если только в источнике нет потока AV1. И как же тогда ещё и его исключить? Какие только не предпринимались попытки её дополнить — всякий раз либо AV1 вылезает, либо 1080 и больше, либо вообще происходит откат на best в 360p. В багтрекере, толком ничего не объясняя, на это говорят «шли бы вы в FAQ». Но и там ничего нет про двойное исключение! Полная логика языка выбора форматов из youtube-dl остаётся загадкой. Вся надежда только на всемогущих ЛОР-экспертов!

Ответ на: комментарий от eternal_sorrow

Ага, с такой вот строчкой выбирается видео в x264 (то есть действительно не в VP9 и не в AV1), но в 1080p (что ожидаемо). Но если добавить к ней [height<=720], причём в любое место (то есть, например, bestvideo[height<=720][vcodec!=vp9][vcodec!=av1]) — выбирается 720p, но не в x264, а в AV1. Странно.

toyo-chi
() автор топика
Ответ на: комментарий от eternal_sorrow

Просто явно выбрать x264? И вроде бы этот вариант действительно работоспособен, но вместе с тем не совсем универсален. Что если в каких-то других онлайн-источниках этот кодек будет промаркирован как-то по-другому? Не ютубом единым, ага. Тогда придётся прибегать ко множественному включению, которое тоже будет выдавать не совсем то, что задумано (наверное). Впрочем, в качестве временного решения скорее всего подойдёт. Спасибо за подсказку!

toyo-chi
() автор топика

У меня вот так работает

ytdl-format=bestvideo[height<=?1080][fps<=?60][vcodec!=?vp9]+bestaudio/best

Почему-то из терминала знак «неравенство» после vcodec копируется как «!равенство»

athost ★★★★★
()
Последнее исправление: athost (всего исправлений: 3)
Ответ на: комментарий от athost

Разумеется, так оно работать будет! Но ровно до тех пор, пока не встретится ролик с потоками ещё и в AV1. А такие уже начинают встречаться. И вот AV1 вместе с VP9 исключаться категорически не хотят. Экстраполируя: если найти ролик, в котором будут потоки в 4k и в AV1 (вот именно такой пока что не попадался, но это пока), и сделать вот так:

ytdl-format=bestvideo[height<=?1080][fps<=?60][vcodec!=?vp9][vcodec!=?av1]+bestaudio/best

— предположительно выберется поток в 1080p, 60 fps, НО в кодеке AV1, который получившаяся строчка тоже должна явно исключать. Вот в этом-то вся и загвоздка.

toyo-chi
() автор топика
Ответ на: комментарий от toyo-chi

И вот AV1 вместе с VP9 исключаться категорически не хотят.

Вот давай пример такого ролика и будем медитировать)
А пока у меня, за долгое время использования такого конфига, все работает как задумано.

athost ★★★★★
()
Последнее исправление: athost (всего исправлений: 1)
Ответ на: комментарий от athost

А пока у меня, за долгое время использования такого конфига, все работает как задумано.

Это всё потому, что AV1 тогда ещё не было!

Как бы то ни было, а на цель в 720p подойдёт медитировать?

  • Ролик: https://www.youtube.com/watch?v=3pDpYur3Nwc;
  • Потоки: x264, VP9, AV1;
  • Максимальное разрешение: 1080p;
  • Цель: 720p, не VP9 и не AV1;
  • Строчка: ytdl-format=bestvideo[height<=?720][fps<=?60][vcodec!=?vp9][vcodec!=?av1]+bestaudio/best;
  • mpv: 0.29.1;
  • youtube-dl: 2020.01.24;
  • Результат: 720p AV1.

Ваш ход!

toyo-chi
() автор топика
Ответ на: комментарий от athost

Почему-то из терминала знак «неравенство» после vcodec копируется как «!равенство»

Потому что лигатуры? Какой шрифт в терминале используется?

eternal_sorrow ★★★★★
()
Ответ на: комментарий от toyo-chi

Ролик: https://www.youtube.com/watch?v=3pDpYur3Nwc;

Цель: 720p, не VP9 и не AV1;

$ youtube-dl --get-format -f 'bestvideo[height<=?720][vcodec^=?avc]' 3pDpYur3Nwc
136 - 1280x720 (720p)

$ youtube-dl -F 3pDpYur3Nwc | grep '^136'
136          mp4        1280x720   720p 1016k , avc1.4d401f, 24fps, video only, 18.32MiB

Дело в том, что полное название кодека, которое сообщает ютуб — это все символы поля до первой запятой, например avc1.4d401f или av01.0.05M.08. Он не матчит когда ты пишешь vcodec!=?av1. Либо пиши !^=?av01, либо !=av01.0.05M.08, но лучше — как во втором комментарии.

anonymous
()
Ответ на: комментарий от anonymous

Так вот в чём было всё дело. Вот теперь наконец-то всё работает в точности как и задумано. Анонимные эксперты ЛОРа как обычно на высоте!

А как во втором комментарии делать не хочется потому, что это может сломать источники, в которых кодеки могут быть промаркированы по-другому или вообще никак:

youtube-dl --get-format -f 'bestvideo[height<=?720][vcodec^=?avc]' https://open.tube/videos/watch/f3b7659c-6352-4e65-82fd-7a4125c9dfbf
ERROR: requested format not available

Но похоже, ничто не мешает совмещать оба подхода:

$ youtube-dl --get-format -f 'bestvideo[height<=?720][vcodec^=?avc]/[height<=?720][vcodec!=?vp9][vcodec!^=?av01]' https://open.tube/videos/watch/f3b7659c-6352-4e65-82fd-7a4125c9dfbf 3pDpYur3Nwc
720p - 720p
136 - 1280x720 (720p)

…если только не пытаться сделать логику ещё более изощрённой и в то же время оставить её относительно компактной:

$ youtube-dl --get-format -f '(bestvideo+bestaudio/best)[height<=?720][vcodec^=?avc]/[height<=?720][vcodec!=?vp9][vcodec!^=?av01]' 3pDpYur3Nwc
18 - 640x360 (360p)

Вот он, внезапный откат к best в 360p!

Так что финальный вариант (на случай, если кто-то ВДРУГ прочтёт это и захочет сделать то же самое), будет всё же примерно вот таким:

(bestvideo+(bestaudio[acodec^=opus]/[acodec^=vorbis]/[acodec^=aac]/bestaudio)/best)[height<=?720][vcodec!=?vp9][vcodec!^=?av01]

Кажется, здесь не должно быть никаких логических ошибок. Наверное. И оно даже работает. Вот. Благодарности всем принимавшим участие и сочувствовавшим!

//Впрочем, если получится исправить «изощрённый и компактный вариант» — будет даже ещё лучше. Но здесь уже начинается самая продвинутая часть!

toyo-chi
() автор топика
Ответ на: комментарий от vs220

Ага, уже выяснили, что дело тут действительно в точном (или неточном — это смотря с какой стороны взглянуть) соответствии строке кодека.

хотя [vcodec^=avc] и вправду лучше

Лучше, но не во всех случаях!

toyo-chi
() автор топика
Последнее исправление: toyo-chi (всего исправлений: 1)
Ответ на: комментарий от toyo-chi

финальный вариант

$ alias ydl720='youtube-dl --get-format -f "((bestvideo[vcodec^=?avc]/bestvideo[vcodec!=?vp9][vcodec!^=?av01])+(bestaudio[acodec^=opus]/bestaudio[acodec^=vorbis]/bestaudio[acodec^=aac]/bestaudio)/best)[height<=?720]"'

$ ydl720 '3pDpYur3Nwc'
136 - 1280x720 (720p)+251 - audio only (tiny)

$ ydl720 'https://open.tube/videos/watch/f3b7659c-6352-4e65-82fd-7a4125c9dfbf'
720p - 720p

Возможно так будет корректнее.

anonymous
()
Ответ на: комментарий от anonymous

О, похоже так действительно будет корректнее! Вот теперь решено просто окончательно до следующего восхитительного нововведения.

toyo-chi
() автор топика
18 июля 2020 г.
Ответ на: комментарий от anonymous

В версиях 0.1x это работало, но из коммандной строки, а не из конфиг файла и у меня не загружало ролики с dash video. В версии 0.2x тоже вроде работало, но долго не тестировал. В версии 0.32.0 уже нет - Error parsing commandline option ytdl-format: option requires parameter

ZugDuk
()
Последнее исправление: ZugDuk (всего исправлений: 2)

в другом треде уже постили наиболее адекватный вариант

ytdl-format=(271/248/247)+251/best[height<1441]

с более сложной логикой эта строка быстро превращается в ад

anonymous
()
Ответ на: комментарий от ZugDuk

Ага. Оказывается теперь нужно писать =
youtube-dl ytdl-format=

ZugDuk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.