X

Скачать youtube видео и разбить его по кадрам в jpeg

Потребовалось мне вытянуть кадр из Youtube видео, остановка плеера и скриншот меня не устроили из-за качества, поэтому я решил выкачать видео, сделать его раскадровку и найти нужный кадр в хорошем качестве. Делать будем это в Linux..

Как всегда разобьем задачу на части:

  • установить нужный софт
  • скачать видео в максимальном разрешении
  • разбить видео на части

Теперь пойдем по порядку.

Для всех этих действий, нам потребуется следующий софт:

  • youtube-dl
  • avconv
  • ffmpeg

Сперва ставим свежий youtube-dl, согласно инструкции: youtube-dl installation

sudo apt-get install curl
sudo curl https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

Теперь ставим avconv и ffmpeg:

sudo apt-get install ffmpeg libav-tools

Всё, весь нужный софт установлен.

Теперь давайте разберемся как качать видео в максимальном разрешении. В качестве, примера возьмем клип Оли Поляковой, "Первое лето без него":

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

youtube-dl -F https://www.youtube.com/watch?v=RaZlsPDVPxg

В ответ получаем такую инфу:

 RaZlsPDVPxg: Downloading webpage
 RaZlsPDVPxg: Downloading video info webpage
 RaZlsPDVPxg: Extracting video information
 RaZlsPDVPxg: Downloading js player en_US-vflnrstgx
 RaZlsPDVPxg: Downloading DASH manifest
[info] Available formats for RaZlsPDVPxg:
format code  extension  resolution note
249          webm       audio only DASH audio   85k , opus @ 50k, 2.41MiB
250          webm       audio only DASH audio  103k , opus @ 70k, 3.18MiB
171          webm       audio only DASH audio  136k , vorbis@128k (44100Hz), 5.56MiB
140          m4a        audio only DASH audio  138k , m4a_dash container, aac  @128k (44100Hz), 5.76MiB
251          webm       audio only DASH audio  182k , opus @160k, 6.04MiB
160          mp4        256x144    DASH video  111k , avc1.42c00c, 13fps, video only, 4.93MiB
278          webm       256x144    DASH video  130k , webm container, vp9, 13fps, video only, 4.89MiB
133          mp4        426x240    DASH video  249k , avc1.4d4015, 25fps, video only, 11.08MiB
242          webm       426x240    DASH video  276k , vp9, 25fps, video only, 10.95MiB
243          webm       640x360    DASH video  512k , vp9, 25fps, video only, 20.28MiB
134          mp4        640x360    DASH video  619k , avc1.4d401e, 25fps, video only, 24.75MiB
244          webm       854x480    DASH video  932k , vp9, 25fps, video only, 37.00MiB
135          mp4        854x480    DASH video 1128k , avc1.4d401e, 25fps, video only, 45.97MiB
247          webm       1280x720   DASH video 1873k , vp9, 25fps, video only, 73.09MiB
136          mp4        1280x720   DASH video 2253k , avc1.4d401f, 25fps, video only, 87.92MiB
248          webm       1920x1080  DASH video 3207k , vp9, 25fps, video only, 127.43MiB
137          mp4        1920x1080  DASH video 4173k , avc1.640028, 25fps, video only, 158.29MiB
17           3gp        176x144    small ,  mp4a.40.2, mp4v.20.3
36           3gp        320x240    small ,  mp4a.40.2, mp4v.20.3
5            flv        400x240    small 
43           webm       640x360    medium ,  vorbis, vp8.0
18           mp4        640x360    medium ,  mp4a.40.2, avc1.42001E
22           mp4        1280x720   hd720 ,  mp4a.40.2, avc1.64001F (best)

Теперь из всего этого разнообразия форматов, выбираем наилучшее видео и наилучший звук, запоминаем номера указанные в столбце "format". У нас это 137 для видео и 251 для звука.

Теперь, качаем видео такой командой:

youtube-dl -f 137+251 https://www.youtube.com/watch?v=RaZlsPDVPxg

Для того чтобы склеить два формата, youtube-dl использует avconv именно для этого мы его и ставили.

В результате в нашей папке создаться файл с именем: Оля Полякова - Первое лето без Него (ПРЕМЬЕРА!)-RaZlsPDVPxg.mkv

Теперь давайте его разобьем по кадрам, для этого создаем еще одну папку output, в которую у нас будут записаны изображения и используем команду имеющую такой формат:

ffmpeg -i ИМЯ-ФАЙЛА -f image2 -q:v 1 output/image-%10d.jpg

т.е. в нашем случае это будет

ffmpeg -i Оля\ Полякова\ -\ Первое\ лето\ без\ Него\ \(ПРЕМЬЕРА\!\)-RaZlsPDVPxg.mkv -f image2 -q:v 1 output/image-%10d.jpg

В результате, после выполнения команды, в папке output появится 9500 изображений, из которых вы и можете выбрать нужный кадр, например такой:

Кадр из клипа Оли Поляковой

На сегодня, это всё :]

--[добавлено 28.07.18]--

Формат команды, чтобы вытащить скриншот из определенной позиции видео

ffmpeg -ss 01:23:45 -i input.mp4 -vframes 1 -q:v 2 output.jpg

тут:
-ss = метка времени, формат hh:mm:ss[.xxx]
-i = путь к видеофайлу
-vframes = захват только одного видеофрейма
-q:v 2 = качество изображения (от 1 до 31, оптимально 2-5)
output.jpg = получаемое изображение

 

Формат команды, чтобы сделать gif-ку из видео:

ffmpeg -ss 00:11:30 -i input.mp4 -t 5 -vframes 50 -vf scale=800:-1 -r 10 -q:v 2 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

то же самое но с оптимизацией слоёв гифки:

ffmpeg -ss 00:11:30 -i input.mp4 -t 5 -vframes 50 -vf scale=800:-1 -r 10 -q:v 2 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

тут:
-ss = метка времени с которой произойдет старт, формат hh:mm:ss[.xxx]
-i = путь к видеофайлу
-t 5 = кол-во секунд видео для обработки
-vframes 50 = кол-во видеофреймов для обработки (кол-во изображений в гифке, по-умолчанию это "-t 5" * "-r 10" = 50)
-vf scale=800:-1 = размер изображения
-r 10 = fps , остальные кадры будут удалены
-q:v 2 = качество изображения (от 1 до 31, оптимально 2-5)
-f image2pipe = отправка не в файл, а в pipe для дальнейшей обработки
-vcodec ppm = видео кодек
-delay = задержка между кадрами видео (если уменьшить параметр -r/2 и увеличить -delay*2 то можно в тот же размер гифки записать в два раза больше времени видео, т.е. -t*2), пример ниже

ffmpeg -ss 00:11:30 -i input.mp4 -t 10 -vf scale=800:-1 -r 5 -q:v 2 -f image2pipe -vcodec ppm - | convert -delay 10 -loop 0 - output.gif

Подробнее про опции можно почитать тут

Категории: Linux

Комментарии (1)