Я использую Ubuntu, и команда youtube-dl работает абсолютно нормально.
Я хочу загрузить только часть видео, которое слишком длинное. Поэтому я хочу скачать только пару минут видео. Пример от 13 минут до 17 минут.
Есть ли способ сделать это
Я использую Ubuntu, и команда youtube-dl работает абсолютно нормально.
Я хочу загрузить только часть видео, которое слишком длинное. Поэтому я хочу скачать только пару минут видео. Пример от 13 минут до 17 минут.
Есть ли способ сделать это
Ответы:
Я не верю, что 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
фактически загрузит только ту часть, которую вы укажете.
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
-map 0:v -map 1:a -c:v libx264 -c:a aac
которые могут улучшить качество. Я также хотел бы добавить, youtube-dl -f bestvideo+bestaudio
чтобы быть уверенным, что я получаю версию самого высокого качества.
Добавляем к ответу Джонни:
Используйте youtube-dl -g "URL"
для получения видео и аудио потоков.
Теперь используйте:
ffmpeg -ss 12:15 -i "1st-URL" -ss 12:15 -i "2nd-URL" -t 5:15 -map 0:v -map 1:a -c:v libx264 -c:a aac output.mkv
Вам нужно будет использовать -ss
опцию для каждого потока. Я также рекомендую сделать это примерно на 30 секунд раньше, а затем использовать другой, -ss 30
чтобы не потерять ключевые кадры. Вот реальный пример использования одного из моих видео на YouTube.
youtube-dl -g https://www.youtube.com/watch?v=gESHIrvIQQo
Выход:
https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/signature/4FFB9B0B7E1703B31F5D07DAD579B55F17EF7BAA.0CB63905C89DD4D33F90CF3AAD728F1ECDFCB9B3/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/
https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/signature/4CD42047D1D5C714377350905C1CC5CBA37C0009.6EED1FC92D17A096235C32E48F4B15DEF7DD99B0/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/
Я хотел сократить с 43:00 до 50:10, так что я собираюсь сделать -ss 42:30
(давая мне несколько секунд, чтобы поймать хороший ключевой кадр) на обоих входах, а затем сделать -ss 30
после входа, чтобы начать в 43:00.
Затем я буду использовать map
для отображения видео 0:v
и аудио 1:a
(0 означает первый вход, который является видео, а 1 означает второй вход, который является аудио), а затем выберу мои параметры кодирования.
ffmpeg -ss 42:30 -i "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/8CCFBF5CAB97341D0CB1F34E85AB6EE20FC7A03E.7679F39A8603CF41A95F10232E2A921EB0774101/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/" -ss 42:30 -i "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/4AACC8E27F9036D36D4D623A771A9F2BAC4674BA.7E4F4FB4DC023E3FE491A991F0F9F2329648DE9D/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv
-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
флаг загружает только аудио. Опустите его из команды, если вы хотите аудио и видео. :)
Вы можете загрузить с самого начала до момента, не загружая все это и редактируя. Это половина того, что задает этот вопрос:
прервать загрузку с
^C
mp4
-F
чтобы увидеть доступные форматы, и выберите mp4
тот, который имеет оба. например -f18
или -f22
обычно там.Да. Это хак .
Еще один вопрос: если вам нужны отдельные форматы видео и аудио, можете ли вы загрузить часть каждого отдельно (используя, ^c
как здесь), а затем объединить их вручную? Я не думаю, что это будет работать для некоторых форматов.
Это не полностью отвечает на вопрос OP, но есть способ загрузить поток с начала до определенной продолжительности, не загружая весь поток. Поскольку YouTube предоставляет поддержку возобновления, мы можем запросить частичный контент, используя Range
заголовок.
Сначала мы получаем URL-адреса потоков:
$ youtube-dl -g https://www.youtube.com/watch?v=yysk8s2vih8
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...
Это должно вывести два URL (каждый для видео и аудио потоков).
Теперь отправьте запрос head на первый URL (который ссылается на видеопоток), чтобы получить общую длину содержимого этого потока:
$ curl "1st-URL" -sI | grep Content-Length
Content-Length: 64380504
Теперь мы разделим эту общую длину контента на общее количество секунд в видео (видео YouTube имеет продолжительность 4 минуты и 7 секунд, что составляет 247 секунд.), Чтобы приблизительно получить длительность контента в 1 секунду:
64380504 / 247 ≈ 260650
Мы умножаем это значение на (количество секунд, которое мы хотим получить с начала + 1)
(мы добавляем единицу, чтобы также грубо учесть дополнительное пространство, занятое метаданными, которые размещаются в начале потока)
Например, чтобы получить приблизительно первые 10 секунд, вам нужно получить первые 260650 * 11 = 2867150
байты, поэтому мы делаем запрос с Range
заголовком:
$ curl "1st-URL" -H "Range: bytes=0-2867150" -o ten_secs.mp4
Это должно загрузить только первые 10 секунд. Загруженный файл должен воспроизводиться, но лучше всего позволить FFmpeg исправить неправильные метаданные:
$ ffmpeg -i ten_secs.mp4 -c copy corrected_ten_secs.mp4
Мы также можем загрузить только начальную часть аудио (2nd-URL) аналогичным образом (длина контента будет отличаться, но общее количество секунд останется неизменным).
Загрузка любой средней части из видео также должна быть возможна таким образом, но, вероятно, это будет намного сложнее, потому что YouTube размещает метаданные в начале потока (в первых нескольких байтах), и без его присутствия в загружаемых медиафайлах, поток не будет играть вообще.
РЕДАКТИРОВАТЬ: Это будет работать только на веб-сайтах с поддержкой резюме, скажем YouTube. Это не будет работать для других сайтов.
Используйте параметр --postprocessor-args для передачи аудио / видео выхода в ffmpeg для редактирования (процессор), поэтому необходимо установить ffmpeg.
--postprocessor-args принимает 3 аргумента и значения (например, theres больше, проверьте страницу руководства ffmpeg):
Примеры:
$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -0: 1: 20" '[video_URL]'
$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'
PS: youtube-dl загрузит весь носитель до его обработки и удалит его после.
Я сделал скрипт, реализующий ответ @godofgrunts здесь
#!/bin/bash
#taken from https://unix.stackexchange.com/a/388148/48971
if [ $# -lt 4 ]; then
echo "Usage: $0 <youtube's URL> <HH:mm:ss from time> <HH:mm:ss to time> <output_file_name>"
echo "e.g.:"
echo "$0 https://www.youtube.com/watch?v=T1n5gXIPyws 00:00:25 00:00:42 intro.mp4"
exit 1
fi
echo "processing..."
from=$(date "+%s" -d "UTC 01/01/1970 $2")
to=$(date "+%s" -d "UTC 01/01/1970 $3")
from_pre=$(($from - 30))
if [ $from_pre -lt 0 ]
then
from_pre=0
fi
from_pre_command_print=$(date -u "+%T" -d @$from_pre)
from_command_print=$(date -u "+%T" -d @$(($from - $from_pre)))$(grep -o "\..*" <<< $2)
to_command_print=$(date -u "+%T" -d @$(($to - $from_pre)))$(grep -o "\..*" <<< $3)
command="ffmpeg "
for uri in $(youtube-dl -g $1)
do
command+="-ss $from_pre_command_print -i $uri "
done
command+="-ss $from_command_print -to $to_command_print $4"
echo "downloading with the following command:"
echo "$command"
$command
Я также загрузил его Gitlab фрагментов «s