Как загрузить часть видео с помощью команды youtube-dl?

Скорее всего, вам просто нужно установить libffi-devel :

dnf install libffi-devel

Он предоставляет оба отсутствующих ffi.h и файлы libffi.pc .

77
18.09.2015, 09:40
13 ответов

Этот запрос функции еще не реализован в youtube-dl. См. # 622 issue и множество его дубликатов на github.

23
27.01.2020, 19:31

Добавление к ответу Джонни:

Используйте youtube-dl --youtube-skip-dash-manifest -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 --youtube-skip-dash-manifest -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 означает второй вход, который является аудио ), а затем выберите мой варианты кодирования.

# The first URL
video_url="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/"
# The second URL
audio_url="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/"
ffmpeg -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv

Спасибо Якубу Вране за решение --youtube-skip-dash-manifest.

67
27.01.2020, 19:31
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed 's/^/-ss 00:05 -i /') -t 01:00 -c copy out.mkv

Отредактируйте URL-адрес и время -ss, -tдля использования этой команды. Он создает аргументы, используя URL-адреса как видео, так и аудио, аналогично этому ответу от @godofgrunts. Для $()кавычки не используются, потому что это дает два отдельных аргумента для ffmpeg.

43
27.01.2020, 19:31

Это не полностью отвечает на вопрос 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-адреса (для видео- и аудиопотоков ).

Теперь отправьте запрос заголовка на первый 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

Мы также можем загрузить только начальную часть аудио (2-й -URL-адрес )аналогичным образом (содержимое -длина будет отличаться, но общее количество секунд останется прежним ).

Загрузка любой средней части видео также должна быть возможной таким способом, но это, вероятно, будет намного сложнее, потому что YouTube помещает метаданные в начале потока (в первых нескольких байтах )и без этого. присутствует в загруженном носителе, поток вообще не будет воспроизводиться.

РЕДАКТИРОВАТЬ:Это будет работать только на веб-сайтах с поддержкой возобновления, например на YouTube. Для других сайтов это не сработает.

9
27.01.2020, 19:31

Я сделал скрипт, реализующий ответ @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 фрагменты

1
27.01.2020, 19:31

Используйте параметр --postprocessor-argsдля передачи аудио/видео выхода на ffmpegдля редактирования (процессора ). Постпроцессор должен быть ffmpegустановлен.

--postprocessor-argsпринимает 3 аргумента и значения (например, есть еще, см. справочную страницуffmpeg):

  • -ss HH:MM:SS:время начала приема
  • -to HH:MM:SS:время окончания
  • -t HH:MM:SS:необходимое время

Примеры:

  • Начать кодирование на 15 секунде и остановить на 1 минуте 20 секунде
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" '[video_URL]'
    
  • Начать кодирование через 15 секунд и занять только следующие 3 минуты 5 секунд
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" '[video_URL]'
    

PS:youtube-dlзагрузит весь носитель перед его обработкой и удалит после.

21
27.01.2020, 19:31

Кто-то сделал пакетный скрипт(для Windows ), который загружает файл и извлекает нужную часть:

@ECHO off

:Input
ECHO.
SET url=
ECHO Enter Youtube-url:
SET /P url=
IF "%url%" EQU "" GOTO End
IF "%url: =%" NEQ "%url%" GOTO Input
ECHO Enter start time (in seconds, or in hh:mm:ss[.xxx] form):
SET /P start=
ECHO Enter duration (in seconds, or in hh:mm:ss[.xxx] form):
SET /P dur=
ECHO.
FOR /F "delims==" %%A IN ('youtube-dl.exe --no-warnings --get-filename "%url%"') DO SET filename=%%A
FOR /F %%B IN ('youtube-dl.exe -g "%url%"') DO (
ffmpeg.exe -hide_banner -ss "%start%" -i "%%B" -c copy -t "%dur%" "%filename%"
)
GOTO Input

:End
0
02.02.2020, 19:56

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

Вы можете найти здесь

Он также может анализировать текст для ссылок на YouTube. Вы просто поставляете, например.:

YouTube.com/blahblah start-1:20

Это загрузит видео из 0 -1 :22 (небольшие различия могут возникнуть из-за ключевых кадров ). Он также может загружать целые видео, просто в этом случае не указывайте временной интервал.

1
10.03.2020, 13:34

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

youtube-dl https://www.youtube.com/watch?v=MJD39Aja1Is --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"

Теперь вы можете комбинировать параметры youtube-dl.exeи ffmpeg, например, выбрать формат, удалить видео и вырезать аудиофайл и т. д. (возможно, вырезать видеофайл, а затем преобразовать его в аудиофайл, что бы ни случилось первый)

youtube-dl -f 251 https://www.youtube.com/watch?v=MJD39Aja1Is -x --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"

Примечание :к видео HLS, например, на Twitch, вам также потребуется добавить --hls-prefer-ffmpeg, чтобы это работало.

4
07.09.2020, 08:45

В дополнение к ответу @hyperpallium :ОП не упомянул, что видео, которое он загружает, должно быть с YouTube.

YouTube до смешного ограничивает свои видео, они разбивают аудио- и видеопотоки на разные файлы и отслеживают вас/продают ваши данные; поэтому могут возникнуть трудности с методом частичной загрузки, а затем нажатием Ctrl + C .

С youtube-dlверсии 2020.11.17 в Microsoft Windows версии 10.0.17134.1304 я скачал часть видео с archive.org:

E:\cs>youtube-dl --abort-on-unavailable-fragment https://archive.org/download/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv
[generic] [HCS] Beastars - 03 [1080p]: Requesting header
[redirect] Following redirect to https://ia601504.us.archive.org/14/items/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv
[generic] [HCS] Beastars - 03 [1080p]: Requesting header
WARNING: Falling back on generic information extractor.
[generic] [HCS] Beastars - 03 [1080p]: Downloading webpage
WARNING: URL could be a direct video link, returning it as such.
[download] Destination: [HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv
[download]   2.3% of 513.77MiB at 839.68KiB/s ETA 10:12
ERROR: Interrupted by user

E:\cs>ren "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv.part" "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv"

E:\cs>ffmpeg -i "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv" "[HCS] Beastars - 03 [1080p].mp4"
ffmpeg version N-91990-g49c67e79ca Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20180813
[stdout text]
    Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      encoder         : Lavc58.30.100 aac
[matroska,webm @ 0000020c8f28a2c0] Read errorme=00:00:33.96 bitrate=2099.5kbits/s speed=0.0185x
frame=  823 fps=0.3 q=-1.0 Lsize=    9677kB time=00:00:34.56 bitrate=2293.8kbits/s speed=0.0147x
video:9134kB audio:519kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.248960%
[libx264 @ 0000020c8f3423c0] frame I:25    Avg QP:14.71  size: 56865
[stdout]

E:\cs>youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale cp1252, fs mbcs, out cp437, pref cp1252
[debug] youtube-dl version 2020.11.17
[debug] Python version 3.4.4 (CPython) - Windows-10-10.0.17134
[debug] exe versions: ffmpeg 3.4, ffprobe N-91990-g49c67e79ca
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

Файл MKV, который у меня получился, был «00 :22 :57» в «общей продолжительности», но он закончился через 34 секунды. Видео MP4, которое у меня получилось, было 00 :00 :общей продолжительностью 34 секунды, закончилось через 34 секунды, а видео и аудио воспроизводились полностью нормально / как и предполагалось.

Полный cmd.exeжурнал находится здесь

В общем, бегите

youtube-dl --abort-on-unavailable-fragment [URL to video file]

(опция --abort-on-unavailable-fragmentможет быть важна, так как вы в конечном итоге прервете загрузку с помощью Ctrl + C ), подождите немного, затем нажмите Ctrl + С .

Дополнительно :переименуйте файл [file].mkv.partв [file].mkv. Преобразование MKV в MP4, вероятно, тоже необязательно.

1
01.02.2021, 19:23

Это добавление ко всем ответам, которые включают --postprocessor-args.

У меня есть решение проблемы, указанной @antgiant, которая --postprocessor-argsприменяется к каждому постпроцессору, описанному здесь(https://github.com/ytdl-org/youtube-dl/issues/26863). Это может привести к тому, что ваши аргументы будут применены более одного раза, что приведет к неожиданному поведению, например, к сокращению вашего видео.

Я бы прокомментировал исходные ответы, но у меня недостаточно репутации для этого. Чтобы обойти это, вы должны настроить youtube -dl для использования файла конфигурации по умолчанию и указать все пост-процессы, которые вы хотите применить к видео/аудио, но еще один пост-процесс для использования в командной строке с помощью --postprocessor-args. Цель состоит в том, чтобы в командной строке был только один постобработчик для --postprocessor-args, чтобы он применялся только один раз.

Например, в моем конфигурационном файле указаны --ffmpeg-location, --audio-formatи --audio-quality. Так что в командной строке я бы использовал только -x.

youtube-dl -x --postprocessor-args "-ss 00:57.50" "URL"

Конечно, это будет работать с любым почтовым процессом в командной строке, пока есть только один, а остальные скрыты в файле конфигурации. Чтобы создать файл конфигурации, просто создайте папку в вашем %appdata% с именем youtube -dl и создайте там config.txt со всеми вашими параметрами.

Это мой первый пост на Unix & Linux Stack Exchange, пожалуйста, не стесняйтесь указывать на ошибки.

1
25.05.2021, 19:16

-o -отправляет видео YouTube на стандартный вывод, который передается в ffmpegс помощью |. -i -вводит видео со стандартного ввода, передаваемого командой youtube-dl. -ss— время начала клипа, а -to— время окончания клипа.`

youtube-dl -o - "https://youtu.be/dQw4w9WgXcQ" | ffmpeg -i - -ss 00:00:15 -to 00:01:30 -c copy FileNameOfYouTubeVideoDownload.mp4

Надеюсь, это поможет!

0
22.08.2021, 03:51

Вот чистый пакетный скрипт, который прекрасно справится со своей задачей. должно быть легко портировать это и на linux. ffmpeg.exe и youtube -dl.exe должны находиться где-то в %PATH%, или просто добавьте полный путь к обеим командам в скрипте.

@echo off
rem
rem Download a part of youtube video
rem
rem Parameters :
rem 
rem "%1" = quality, "-f18", "-f22",...
rem "%2" = youtube video "url"
rem "%3" = starttime "HH:MM:SS"
rem "%4" = duration "HH:MM:SS" (to capture 1 minute 00:01:00)
rem "%5" = outputfile "my-part.mp4"

youtube-dl "%1" -g "%2" > urls.tmp
rem read the first line of the file "urls.tmp" in the variable "url"
set /p url=< urls.tmp
ffmpeg -ss "%3" -i "%url%" -t "%4" -c copy "%5"
del urls.tmp

В Linux вы можете использовать эту команду:

ffmpeg -ss "starttime" -i $(youtube-dl "url" "quality" -g) -t "duration" -c copy "output-file.mp4"

Удачи

0
09.10.2021, 17:38

Теги

Похожие вопросы