Скачать youtube видео и разбить его по кадрам в jpeg
Потребовалось мне вытянуть кадр из Youtube видео, остановка плеера и скриншот меня не устроили из-за качества, поэтому я решил выкачать видео, сделать его раскадровку и найти нужный кадр в хорошем качестве. Делать будем это в Linux..
Как всегда разобьем задачу на части:
- установить нужный софт
- скачать видео в максимальном разрешении
- разбить видео на части
Теперь пойдем по порядку.
Для всех этих действий, нам потребуется следующий софт:
- youtube-dl
- avconv
- ffmpeg
Сперва ставим свежий youtube-dl, согласно инструкции: youtube-dl installation
1 2 3 4 5 |
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:
1 2 3 |
sudo apt-get install ffmpeg libav-tools |
Всё, весь нужный софт установлен.
Теперь давайте разберемся как качать видео в максимальном разрешении. В качестве, примера возьмем клип Оли Поляковой, "Первое лето без него":
Открываем консоль, создаем какую-нибудь папку, переходим в неё и выполняем:
1 2 3 |
youtube-dl -F https://www.youtube.com/watch?v=RaZlsPDVPxg |
В ответ получаем такую инфу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[youtube] RaZlsPDVPxg: Downloading webpage [youtube] RaZlsPDVPxg: Downloading video info webpage [youtube] RaZlsPDVPxg: Extracting video information [youtube] RaZlsPDVPxg: Downloading js player en_US-vflnrstgx [youtube] 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 для звука.
Теперь, качаем видео такой командой:
1 2 3 |
youtube-dl -f 137+251 https://www.youtube.com/watch?v=RaZlsPDVPxg |
Для того чтобы склеить два формата, youtube-dl использует avconv именно для этого мы его и ставили.
В результате в нашей папке создаться файл с именем: Оля Полякова - Первое лето без Него (ПРЕМЬЕРА!)-RaZlsPDVPxg.mkv
Теперь давайте его разобьем по кадрам, для этого создаем еще одну папку output, в которую у нас будут записаны изображения и используем команду имеющую такой формат:
1 2 3 |
ffmpeg -i ИМЯ-ФАЙЛА -f image2 -q:v 1 output/image-%10d.jpg |
т.е. в нашем случае это будет
1 2 3 |
ffmpeg -i Оля\ Полякова\ -\ Первое\ лето\ без\ Него\ \(ПРЕМЬЕРА\!\)-RaZlsPDVPxg.mkv -f image2 -q:v 1 output/image-%10d.jpg |
В результате, после выполнения команды, в папке output появится 9500 изображений, из которых вы и можете выбрать нужный кадр, например такой:
На сегодня, это всё :]
--[добавлено 28.07.18]--
Формат команды, чтобы вытащить скриншот из определенной позиции видео
1 2 3 |
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-ку из видео:
1 2 3 |
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 |
то же самое но с оптимизацией слоёв гифки:
1 2 3 |
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), пример ниже
1 2 3 |
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 |
Подробнее про опции можно почитать тут
Author: | Tags: /
| Rating:
2 comments.
Write a comment