Я не верю, что youtube-dl
один сделает то, что ты хочешь. Однако вы можете комбинировать его с утилитой командной строки, такой как ffmpeg.
Сначала получите фактический URL, используя youtube-dl:
youtube-dl -g "https://www.youtube.com/watch?v=V_f2QkBdbRI"
Скопируйте вывод команды и вставьте его как часть -i
параметра следующей команды:
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:00:15.00 -t 00:00:10.00 -c copy out.mp4
-ss
Параметр в этом положении говорится , чтобы сбросить все входные данные вплоть до 15 секунд в видео. -t
Вариант гласит , чтобы захватить в течение 10 секунд. Остальная часть команды говорит, что это должно быть сохранено как mp4.
ffmpeg является популярным инструментом и должен быть в любом из популярных репозиториев ОС / менеджеров пакетов.
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
фактически загрузит только ту часть, которую вы укажете.источник
-map 0:v -map 1:a -c:v libx264 -c:a aac
которые могут улучшить качество. Я также хотел бы добавить,youtube-dl -f bestvideo+bestaudio
чтобы быть уверенным, что я получаю версию самого высокого качества.Добавляем к ответу Джонни:
Используйте
youtube-dl -g "URL"
для получения видео и аудио потоков.Теперь используйте:
Вам нужно будет использовать
-ss
опцию для каждого потока. Я также рекомендую сделать это примерно на 30 секунд раньше, а затем использовать другой,-ss 30
чтобы не потерять ключевые кадры. Вот реальный пример использования одного из моих видео на YouTube.видео
Выход:
Я хотел сократить с 43:00 до 50:10, так что я собираюсь сделать
-ss 42:30
(давая мне несколько секунд, чтобы поймать хороший ключевой кадр) на обоих входах, а затем сделать-ss 30
после входа, чтобы начать в 43:00.Затем я буду использовать
map
для отображения видео0:v
и аудио1:a
(0 означает первый вход, который является видео, а 1 означает второй вход, который является аудио), а затем выберу мои параметры кодирования.источник
-i
флаг ffmpeg может принимать URL. аккуратный--postprocessor-args
непосредственно в youtube-dl?Этот запрос еще не реализован в youtube-dl. Смотрите выпуск # 622 и множество его дубликатов на github.
источник
youtube-dl
поддерживает передачу аргументов в базовый постпроцессор (протестировано с версией 2017.08.27.1):youtube-dl -x --postprocessor-args "-ss 00:13:00.00 -t 00:04:00.00" https://youtu.be/...
По сути, это то же самое, что и постобработка с
ffmpeg
самим собой после первой загрузки файла.источник
unable to obtain file audio codec with ffprobe
ошибку. Можете ли вы помочь мне с этим. Я использую CentOS 7-x
флаг загружает только аудио. Опустите его из команды, если вы хотите аудио и видео. :)Вы можете загрузить с самого начала до момента, не загружая все это и редактируя. Это половина того, что задает этот вопрос:
mp4
-F
чтобы увидеть доступные форматы, и выберитеmp4
тот, который имеет оба. например-f18
или-f22
обычно там.Да. Это хак .
Еще один вопрос: если вам нужны отдельные форматы видео и аудио, можете ли вы загрузить часть каждого отдельно (используя,
^c
как здесь), а затем объединить их вручную? Я не думаю, что это будет работать для некоторых форматов.источник
Это не полностью отвечает на вопрос OP, но есть способ загрузить поток с начала до определенной продолжительности, не загружая весь поток. Поскольку YouTube предоставляет поддержку возобновления, мы можем запросить частичный контент, используя
Range
заголовок.Сначала мы получаем URL-адреса потоков:
Это должно вывести два URL (каждый для видео и аудио потоков).
Теперь отправьте запрос head на первый URL (который ссылается на видеопоток), чтобы получить общую длину содержимого этого потока:
Теперь мы разделим эту общую длину контента на общее количество секунд в видео (видео YouTube имеет продолжительность 4 минуты и 7 секунд, что составляет 247 секунд.), Чтобы приблизительно получить длительность контента в 1 секунду:
64380504 / 247 ≈ 260650
Мы умножаем это значение на (количество секунд, которое мы хотим получить с начала + 1)
(мы добавляем единицу, чтобы также грубо учесть дополнительное пространство, занятое метаданными, которые размещаются в начале потока)
Например, чтобы получить приблизительно первые 10 секунд, вам нужно получить первые
260650 * 11 = 2867150
байты, поэтому мы делаем запрос сRange
заголовком:Это должно загрузить только первые 10 секунд. Загруженный файл должен воспроизводиться, но лучше всего позволить FFmpeg исправить неправильные метаданные:
Мы также можем загрузить только начальную часть аудио (2nd-URL) аналогичным образом (длина контента будет отличаться, но общее количество секунд останется неизменным).
Загрузка любой средней части из видео также должна быть возможна таким образом, но, вероятно, это будет намного сложнее, потому что YouTube размещает метаданные в начале потока (в первых нескольких байтах), и без его присутствия в загружаемых медиафайлах, поток не будет играть вообще.
РЕДАКТИРОВАТЬ: Это будет работать только на веб-сайтах с поддержкой резюме, скажем YouTube. Это не будет работать для других сайтов.
источник
Используйте параметр --postprocessor-args для передачи аудио / видео выхода в ffmpeg для редактирования (процессор), поэтому необходимо установить ffmpeg.
--postprocessor-args принимает 3 аргумента и значения (например, theres больше, проверьте страницу руководства ffmpeg):
Примеры:
PS: youtube-dl загрузит весь носитель до его обработки и удалит его после.
источник
Я сделал скрипт, реализующий ответ @godofgrunts здесь
Я также загрузил его Gitlab фрагментов «s
источник