LINUX.ORG.RU

ffmpeg склеить тысячи фото в видео

 , , , ,


0

1

доброго дня.
есть видео камера которая не пишет видео, а делает скриншоты и шлет их на уй фтп. фотографий за сутки получается вагон и тележка.
хочу с помощью ffmpeg склеить эти тысячи фотографий в видео. но не все так просто. у фоток есть дата когда они были сделаны, да еще и пишутся названия у них на русском, к примеру - Вход_в_ад_date_06.06.1999. я не понял как выбирать определенные фотографии и создавать из них видео.
на официальном сайте ffmpeg есть руководство - http://www.ffmpeg.org/faq.html#How-do-I-encode-single-pictures-into-movies_003f

например так

ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg

но почему то во первых создается файл длинной 0 секунд, во вторых там 1 фотка. и еще вопрос, как создать видеофайл из фотографий N количества , длинной N часов? какое то ведь кол-во фотографий он будет за секунду показывать, а если фотографий у меня за 5 часов и он будет показывать 25 кадров в секунду, как там разобраться где что произошло.



Последнее исправление: bidjo (всего исправлений: 1)

но почему то во первых создается файл длинной 0 секунд

Это командой просто кодируешь картинки в видеофайл с одним фреймом.

Для решения твоей проблемы нужно сорт оф слайдшоу, можешь почитать об этом здесь:

https://trac.ffmpeg.org/wiki/Slideshow

там есть хорошие примеры, вплоть до того, чтобы сортировать картинки через средствами bash, а не средствами ffmpeg.

hikoseuro
()

я не понял как выбирать определенные фотографии и создавать из них видео.

Сгенерируй список файлов из которых хочешь видео создать: https://trac.ffmpeg.org/wiki/Concatenate
При генерации видео укажи нужный Framerate: https://trac.ffmpeg.org/wiki/Slideshow
Там можно установить показывать 1 кадр в секунду или 1 кадр каждые 5 секунд, выбирай любой framerate. Если использовать список файлов, то вообще можно для каждого изображения указывать длительность показа отдельно.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

спасибо большое за подсказки
проблема в именах файлов. примерное имя файлов такое - Лесной участок камера2_04-08-2018_22h01m03s582ms
оно может немного варьироваться, но по сути это много букаф и цифр в перемешку с русским и английским.
список файлов создавал через

(for %i in (*.jpg) do @echo file '%i') > mylist.txt
по началу получалась херь в хз каком формате.
через .bat
@echo off
setlocal
1>nul chcp 1251
cd c:\1
(for %%i in (*.jpg) do @echo file '%%i') > mylist.txt
стали создаваться нормальные имена. но
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output
все равно выдавал ошибку
Unsafe file name 'Болотная площадь 7 Подёлкой_04-08-2018_22h01m03s655ms.jpg'[br]mylist.txt: Operation not permitted

конечно если ему дать img1.jpg .... img10.jpg то он работает. но у меня тысячи файлов другого наименования:)
glob pattern тоже не пашет.
на
ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' -c:v libx264 -pix_fmt yuv420p out.mp4
я получаю
'*.jpg': Invalid argument


заработала следующая комманд лайна
ffmpeg -y -r 1/0.5 -f concat -safe 0 -i "C:\1\1.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "C:\1\out.mp4"
правда создает она жутко долго ,5 сек из 11 фотографий. Если я сожму десяток тысяч фоток, это займет 75 минут.


в идеале бы конвертировать фото с именным фильтром, например старт с
Болотная площадь 7 Подёлкой_10-08-2018_00h00m01s655ms.jpg
по
Болотная площадь 7 Подёлкой_10-08-2018_23h59m50s655ms.jpg

или на худой конец просто с указанием папки из которой надо брать файлы.

bidjo
() автор топика
Ответ на: комментарий от bidjo

по началу получалась херь в хз каком формате.
через .bat

А ты смотрел что там за список сгенерировался? Я вот в notepad создал список вручную используя имя «Болотная площадь 7 Подёлкой_04-08-2018_22h01m03s655ms.jpg» и ffmpeg его съел и не подавился. Можешь попробовать полные пути прописывать, у меня и с относительным путем все заработало. Про bat подсказать ничего не могу, если есть python то его лучше использовать, либо PowerShell накрайняк.
Вот так например можно без перекодировки в Mjpeg упаковать(у меня только в avi фреймрейт нормально работает при copy, для mkv 25fps врубает):

ffmpeg -f concat -safe 0 -r 1 -i list.txt -vcodec mjpeg -c copy -r 1 -framerate 1 output.avi
Если же с перекодировкой, то и в mkv нормально фреймрейт работает:
ffmpeg -f concat -safe 0 -r 1 -i list.txt -vcodec mjpeg -r 1 -framerate 1 output.mkv
С x264 также хорошо работает:
ffmpeg -f concat -safe 0 -r 1 -i list.txt -vcodec libx264 -r 1 -framerate 1 output.mkv

или на худой конец просто с указанием папки из которой надо брать файлы.

На линуксе у меня вот такая команда срабатывает:

ffmpeg -i %*.jpg -vcodec mjpeg -c copy -r 1 -framerate 1 output.avi
Можно конечно поэкспериментировать, но лучше всего передавать списком файлов, особенно на винде.

правда создает она жутко долго ,5 сек из 11 фотографий. Если я сожму десяток тысяч фоток, это займет 75 минут.

А ты почитай https://trac.ffmpeg.org/wiki/Encode/H.264 там есть пресеты типа fast. Если хочешь пережать jpeg файлы то да, libx264 сожмет очень хорошо и быстро если правильно параметры подобрать. Если же тебе просто объединить jpeg в один файл без перекодировки то используй mjpeg с "-c copy".

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

без CHCP 1251 генерится вот так:

file 'Ѓ®«®в­ п Ї«®й ¤м 7 Џ®¤с«Є®©_04-08-2018_22h01m03s655ms.jpg'

почему я хз. все локали проверил, везде 1251 стоит. винда десятка.

ffmpeg -i %*.jpg -vcodec mjpeg -c copy -r 1 -framerate 1 output.avi 
ругается что нету в папке %*.jpg. делаю на винде. по всей видимости придется для облегчения процесса делать перекодировку на убунте.

из всех приведенных вариантов полностью корректно сработал
ffmpeg -f concat -safe 0 -r 1 -i list.txt -vcodec libx264 -r 1 -framerate 1 output.mkv

остальные работают по ощущениям раза в два три быстрее, но видео начинается с 2 кадра что ли. я брал 12 файлов, в видео было 11. первый кадр был просто черный.
и все таки наверно есть способ в винде указать папку целиком? тег паттерн глоб непашет:(

bidjo
() автор топика
Ответ на: комментарий от bidjo
ffmpeg -f concat -safe 0 -r 1/0.5 -i list.txt -b 96000 movie96000.avi

сжимает 9500 фоток за примерно 5-7 минут с ссд и i5-7400
но вот беда.

-b 96000
я думал этот параметр влияет на качество видео. на выходе видео весит всего 80 метров. и качество почти УГ. я менял с 9600 до 96000, файл стал больше на 1 метр но качество не изменилось. что я делаю не так?:)

bidjo
() автор топика
Ответ на: комментарий от bidjo

немогу редактировать сообщения. вот жопа печалька.

код

ffmpeg -f concat -safe 0 -r 2 -i list.txt -an -qscale 4 1.avi
дает результат по снижению веса и увеличению качества, но
qscale N
работает не понятно. Что на 1 что на 2 он не изменяет выходной размер. На 3 размер сокращается примерно на 40%. На 4 размер как при простом конвертировании в .avi
На выходе из 9500 картинов общим весом в 1.9ггб я получил avi весом почти в гиг. Качество норм. Но таки еще бы порезать его на 30% по обьему, было бы весьма не дурно.

в логе сыпется
deprecated pixel format used make sure you did set range correctly
что бы это означало.

bidjo
() автор топика
Ответ на: комментарий от bidjo

наврал. при склеивании 10 файлов нифига разницы не видно между qscale 3 и 4. при склеивании десяти тысяч фоток получилось вместо 0.99ггб 706мб. Так что круто круто:)

батник миниавтоматизации в папке

@echo off
setlocal
1>nul chcp 1251
cd C:\1\g
(for %%i in (*.jpg) do @echo file '%%i') > list.txt
ffmpeg -f concat -safe 0 -r 2 -i list.txt -an -qscale 4 1.avi
pause

осталось дописать удаление фото-файлов которые были склеяны и назначить выходному avi файлу имя с какого по какой файл была сделана склейка, к примеру имя
Болотная площадь 7 Подёлкой_04-08-2018_22h01m03s655ms по Болотная площадь 7 Подёлкой_05-08-2018_22h01m03s655ms.jpg

bidjo
() автор топика

jpg

ну всё правильно, тебе поможет rm -rf ./*.jpg

а так конечно ты хочешь

for f in *.jpg; do jpegtran -optimize -copy none -perfect -v "$f" > "outputdir/$f"; done
cd outputdir
ffmpeg -framerate 30 -i img%03d.jpg -codec copy output.mkv

anonymous
()

.mpg

убиват

anonymous
()
Ответ на: комментарий от bidjo

ffmpeg -f concat -safe 0 -r 1/0.5 -i list.txt -b 96000 movie96000.avi

А что за кодек в этом случае используется?

я думал этот параметр влияет на качество видео. на выходе видео весит всего 80 метров. и качество почти УГ. я менял с 9600 до 96000, файл стал больше на 1 метр но качество не изменилось. что я делаю не так?:)

У меня одно время была задача кодирования в реальном времени с нормальным качеством, минимальным размером видео и минимальной нагрузке на процессор. Я брал референсные видео и запускал скрипт который перебирал все возможные параметры и замерял время кодирования и размер и составлял таблицу, libx264 лучший в плане оптимизаций.
Вот так примерно кодируется(параметры preset/crf/tune это чисто для libx264 кодера, хотя у других кодеков также могут быть такие параметры, но необязательно):

ffmpeg -f concat -safe 0 -r 1 -i list.txt -vcodec libx264 -preset medium -crf 31 -tune grain -r 1 -framerate 1 output.mkv
"-preset" Параметр отвечает за скорость, ultrafast от veryslow по качеству при остальных настройках отличаться не должен, но вот размер файла у ultrafast будет большим но зато скорость кодирования будет молниеносная, у veryslow будет меньше размер файла, но кодировать будет дольше. Лучше начинай экспериментировать с medium, возможные параметры:
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
"-crf" Вот этот параметр отвечает за качество чем меньше значение тем лучше качество при значении «0» будет лучшее качество, при максимальном «51» будет худшее качество и возможно просто мешанина. Попробуй поэкспериментировать с стандартного «23». Диапазон 0-51.
"-tune" Это настройки под определенный тип видео, как-то анимация, видео или для стриминга с минимальной задержкой или для более быстрой декодировки. Этот параметр может положительно повлиять на уменьшения размера видео, но надо экспериментировать на референсном видео. Я бы советовал попробовать один из этих вариантов после того как подберешь preset и crf: film, animation, grain, stillimage.

V1KT0P ★★
()
Ответ на: комментарий от bidjo

наврал. при склеивании 10 файлов нифига разницы не видно между qscale 3 и 4. при склеивании десяти тысяч фоток получилось вместо 0.99ггб 706мб. Так что круто круто:)

Лучше явно указывай libx264 будет лучше качество, меньше размер и быстрее, кстати можно ограничить кодирование только на 1 ядре: "-threads 1", но запускать сразу кодирование сразу для нескольких директорий, у меня есть мнение что эффективней запускать несколько однопоточных задач кодирования но я могу ошибаться. Вот так указывается сколько хочешь ядер при кодировании использовать:

ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset medium -crf 31 -tune grain -r 1 -framerate 1 output.mkv
Кстати порядок следования параметров иногда имеет значение, так что лучше их просто так не тасовать.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

спасибо.
батник создания avi и подчищения за собой

@echo off
setlocal
1>nul chcp 1251
cd C:\3
(for %%i in (*.jpg) do @echo file '%%i') > list.txt 
ffmpeg -f concat -safe 0 -r 2 -i list.txt -an -qscale 8 1.avi
call
For /F "delims=" %%A In ('Dir "*.*" /A-D /B') Do (Echo %%~A)>>list.txt
For /f "tokens=*" %%i in (list.txt) do attrib -a %%i 
attrib -a %0 
del /aa /q /f *.*
del list.txt
exit


ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 4 -vcodec libx264 -preset medium -crf 31 -tune grain -r 1 -framerate 1 output.mkv


при задействовании всех четырех ядер ну очень долго отрабатывает:( примерно в 3 раза медленнее. Качество на высоте, но mkv чет мой ЦПУ не осиливает или что. Вес файла сжался до 221 метра.

используя
-qscale 6 или 7 или 8 
получаем 5-8 минут работы, и из входящих двух гигов фоток, получаем 500-300 мб видео.
Да и после конвертирования в mkv видео реально долго открывается.

bidjo
() автор топика
Ответ на: комментарий от bidjo

У тебя там первопень что ли? Можешь посмотреть что за дерьмо у тебя в контейнере напихано, что гадать-то. Mediainfo. В матрёшку упакуешь что угодно — нет ограничений, как у avi.

anonymous
()

Одного меня смутило что под ёлкой на Болотной есть камера?

Deleted
()
Ответ на: комментарий от bidjo

-qscale 6 или 7 или 8

"-qscale" это параметр для MPEG-4, у libx264 аналог этого параметра "-qp 23" в твоем случае этот параметр даже лучше использовать вместо "-crf". "-qp" - ограничивает качество видео также от 0 до 51 не лимитируя размер, в то время как "-crf" ограничивает качество путем установки максимального размера видео, например в моем случае было критично чтоб небыло спонтанных увеличений размера видео, даже если это приведет к месиву на экране поэтому использовали "-crf".
Тебе же лучше подойдет параметр "-qp", он варьирует битрейт в зависимости от необходимости для поддержания нужного уровня качества.

Качество на высоте, но mkv чет мой ЦПУ не осиливает или что.

Это просто контейнер, libx264 можно в любой контейнер пихать: avi/mp4/mkv. Выбирай на любой вкус, ffmpeg выбирает контейнер по расширению выходного файла. Видео в libx264 можно без перекодировки в любой контейнер перепаковать, скорость этого действия равняется скорости копирования файла на диск.

Качество на высоте, но mkv чет мой ЦПУ не осиливает или что. Вес файла сжался до 221 метра.

Попробуй разные параметры скорости и качества, если качество на высоте то уменьши качество но увеличь скорость кодирования. Например вот такие настройки проверь, сравни качество, размер и скорость кодирования:

ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset veryfast -qp 30 -tune grain -r 1 -framerate 1 output-veryfast-30.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset veryfast -qp 35 -tune grain -r 1 -framerate 1 output-veryfast-35-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset veryfast -qp 40 -tune grain -r 1 -framerate 1 output-veryfast-40-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset veryfast -qp 45 -tune grain -r 1 -framerate 1 output-veryfast-45-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 30 -tune grain -r 1 -framerate 1 output-ultrafast-30-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 35 -tune grain -r 1 -framerate 1 output-ultrafast-35-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 40 -tune grain -r 1 -framerate 1 output-ultrafast-40-grain.avi
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 45 -tune grain -r 1 -framerate 1 output-ultrafast-45-grain.avi

V1KT0P ★★
()
Ответ на: комментарий от anonymous

у меня i5-7400 и ссд. но фоток не 1 и даже не 10 000
и если я каждое видео буду генерить по 20 минут, я потрачу пол дня.

Полное имя                               : C:\1\1\output.mkv
Формат                                   : Matroska
Версия формата                           : Version 4 / Version 2
Размер файла                             : 221 Мбайт
Продолжительность                        : 1 ч. 17 м.
Общий поток                              : 397 Кбит/сек
Программа кодирования                    : Lavf58.17.101
Библиотека кодирования                   : Lavf58.17.101
ErrorDetectionType                       : Per level 1


сжал то он круто, тока долго чето:)

bidjo
() автор топика
Ответ на: комментарий от bidjo
ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 45 -tune grain -r 1 -framerate 1 output-ultrafast-45-grain.avi

ульрафаст. но качество жуткое:) 500 мегов в 30 мегов сжал. картинки пикселями порядочно пошли.

ffmpeg -f concat -safe 0 -r 1 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 30 -tune grain -r 1 -framerate 1 output-ultrafast-30-grain.avi
наверно лучше подойдет. но чето не понял как в 1 сек загонять 2 или более картинки. фреймрейт менял на 2 и 3, все равно 1 картинка в секунду. как быть?

bidjo
() автор топика
Ответ на: комментарий от bidjo

qp 45

больше 19-21 не ставь — качество говно будет

ультрафаст тоже не очень в принципе

если хочешь бесплатного кодирования, используй nvenc

anonymous
()
Ответ на: комментарий от bidjo

наверно лучше подойдет. но чето не понял как в 1 сек загонять 2 или более картинки. фреймрейт менял на 2 и 3, все равно 1 картинка в секунду. как быть?

У меня работает заменяю все три значения(два параметра "-r" и один "-framerate"):

ffmpeg -f concat -safe 0 -r 2 -i list.txt -threads 1 -vcodec libx264 -preset ultrafast -qp 30 -tune grain -r 2 -framerate 2 output-2fps.avi

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

всем спасибо за подсказки.
в выходные разгребу завал дел и напишу что в итоге получилось со скриптами автоматизации.
итоговый так сказать код:)

bidjo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.