Як створити відео з зображень за допомогою FFmpeg?


86

Чи можливо за допомогою ffmpegстворити відео з набору послідовностей, де число не починається з нуля?

Наприклад, у мене є деякі зображення [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], і я хочу їх перетворити у відео. Я спробував таку команду, але вона не спрацювала (схоже, число повинно починатися з нуля):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Будь-яка порада?


Минув час, коли ви задали це питання, але якщо ви все ще цікавитесь питанням, відповідь ТАК - я розмістив деталі та приклад нижче: stackoverflow.com/a/12160155/181638
Асад Ебрагім

@casperOne було б корисно мати уявлення, чому це поза темою. Це здається специфічною проблемою програмування. Тег FFmpeg має 3,7 тис. Підписників, і люди з 27-ти переглядом явно вважають його корисним ..
geotheory

2
@geotheory Статистика тегів не має значення. ffmpeg - це програма, багато в чому сказати, WinRar. Хоча ви можете програмувати проти бібліотек у ffmpeg , це питання не про це. Використовуючи ffmpeg з командного рядка, потрібно запитати в Super User , де це питання.
casperOne

Відповіді:


81

Не потрібно перейменовувати файли, якщо ви користуєтесь -start_numberперемикачем так:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

де nпочаток послідовності фотознімків.

Зверніть увагу, це буде працювати до тих пір, поки послідовність не буде порушена, як тільки вона запуститься. Якщо є прогалини, і ви хочете, щоб усі фотографії були включені, то для заповнення прогалин може знадобитися перенумерування.

Є й інші перемикачі, які можуть вам бути корисними.

Я використовую наступний однолінійний малюнок, щоб отримати більш низьку частоту кадрів і стискати зображення та мати менший отриманий відеоролик:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

Цей -r 3параметр встановлює частоту кадрів отриманого відео на 3 кадри в секунду, щоб я міг бачити кожне ще протягом короткого періоду часу. -sВаріант перемасштабірует знімки в потрібний дозвіл керувати розміром отримуваного відео.

(У оболонці Windows замініть -i Imgp%04d.jpgна -i "Imgp%%04d.jpg". Заслуговуйте на це Майку Фіцпатрику https://superuser.com/a/344178/153054 )


4
яка різниця між -r та -framerate?

1
вони ж IIRC
rogerdpack

22
Не потрібно нумерувати дурниці, якщо ви раді прийняти замовлення, яке вони з'являються у (скажімо, "ls" ... просто використовуйте: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4
Orwellophile

2
Чи є якийсь перемикач для керування часовим проміжком між зображеннями, скажімо, я хотів би показати перше зображення 13s, друге 15s, 24s - третє, часовий проміжок визначено користувачем, чи це можливо?
zionpi

2
дивіться також trac.ffmpeg.org/wiki/…
david.libremone

38

ви можете використовувати цей фрагмент коду нижче:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

Це не обертає JPG до обертання, зазначеного в метаданих.
Ерік Йоханссон

17

Ви можете знайти приклад скрипту в документації на ffmpeg :

3.2 Як кодувати окремі фотографії у фільмах?

Якщо у вас є велика кількість зображень для перейменування, ви можете скористатися наступною командою, щоб полегшити тягар. Команда, використовуючи синтаксис оболонки Bourne, символічно пов'язує всі файли в поточному каталозі, які відповідають * jpg, до /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' тощо.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Потім запустіть:

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

2
Ви б краще зробити x = 0 для початку, щоб ім'я зображення було запущено img000.jpg, оскільки це очікує ffmpeg. Крім того, символічне посилання не працювало для мене, оскільки ffmpeg не міг знайти файли, тому мені довелося замість цього використовувати cp (очевидно, швидкість та пробіл притягують назад, але я все-таки їх rm). mv також працює, якщо ви не проти втратити оригінали.

Зауважте, що у цій відповіді подана команда створює жорсткі посилання, а не символьні посилання. Що стосується використання, cpякщо зв'язок не працює, якщо ваша файлова система підтримує, це cp --reflink=autoдозволить значно покращити швидкість / використання місця.
Фелікс Сапареллі

12

З документів ffmpeg:

Використання глобального шаблону

ffmpeg також підтримує глобус у стилі bash (* представляє будь-яку кількість будь-яких символів).

Це корисно, якщо ваші зображення є послідовними, але не обов'язково в послідовному чисельному порядку, як у попередніх прикладах.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Отже, доки ваші файли будуть відсортовані, використання -pattern_type globперемикача повинно працювати вам.


Зауважте, що цей глобус обмежений, ніж звичайні кулі оболонки: trac.ffmpeg.org/ticket/3620, мабуть, тому, що тип зображення виводиться з розширення.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

11

Наскільки я знаю, ви не можете запустити послідовність у випадкових числах (я не пам'ятаю, чи слід її починати з 0 або 1), плюс, вона не може мати прогалини, якщо так, ffmpeg припустить, що послідовність закінчена і припиніть додавати більше зображень.

Також, як зазначено в коментарях до моєї відповіді, пам’ятайте, що вам потрібно вказати ширину вашого індексу. Подібно до:

зображення% 03d.jpg

І якщо ви використовуєте тип індексу% 03d, вам потрібно обкласти файли файлів 0, як-от:

image001.jpg image002.jpg image003.jpg

тощо.


1
Якщо назви файлів зображень мають провідні нулі, то в рядку формату також слід вказати ширину, як "% 03d".

1
Якщо це єдина перешкода, ви можете просто написати сценарій, щоб або перейменовувати або символізувати свої зображення до належно перейменованого набору.
Каскабель

1
Так, я працював з цим раніше, я писав обгортку в Ruby деякий час тому, де ви викликали instance.addImage (), потім instance.processVideo (), і це створить часовий каталог, скопіюйте / перейменуйте зображення за допомогою відповідних індексів і створити відео. Це досить просто.

@Jefromi Я створив симпосилання, але як мені дати шлях файлу symlink до ffmpeg? Це просто передбачає, що файл символьного посилання є зображення, яке я намагаюся перетворити? Я на win7 btw

Послідовність може починатися від 0 до 4 включно.
Асад Ебрагім

5

Я погоджуюся з Франциско, але в якості вирішення ви можете просто написати швидкий сценарій для переміщення або створення символічних посилань на файли з порядковими номерами, які потрібні ffmpeg. Потім сценарій може викликати ffmpeg, а потім видалити посилання або перемістити файли назад у їх початкові місця.


1

підняти погляд

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

Я знаю, що це старе питання, але я натрапив на нього в Google, шукаючи тієї самої відповіді. Жодна з відповідей тут мене повністю не задовольнила, тому я більше шукав і читав, і це команда, яку я придумав для власної проблеми.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Причина, чому я використовував би таку команду, це ...

  1. Кіт та -f image2pipe дозволяють точніше контролювати зображення, якими ви користуєтесь. Наприклад, це дозволяє використовувати функції bash, такі як розширення дужок, та інші команди на зразок grep для точного налаштування результатів, якщо ви виберете.
  2. Менше комутаторів, які запам'ятовуються.
  3. Я рекомендую НЕ використовувати -r, а просто використовувати -framerate. На моєму досвіді, -r має тенденцію частіше опускати кадри.
  4. Менш складні, без зайвих перемикачів у використанні, і він працюватиме як є. Ви можете додати більше складності (наприклад, вказавши кодер) та тонкої настройки, щоб відповідати вашим потребам.

Що стосується питання ОП, -start_numberчи все, що потрібно.
Gyan

0

Я використовував кодер flv, оскільки моє відео проходило у флеш-програвач (Jwplayer)

ffmpeg -i% d.jpg -vcodec flv test.flv


0

З документації , здається, ви можете просто використовувати *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Як зауваження, для покращення впливу на якість може бути важливою швидкість / кадрів в секунду (наприклад, спочатку вказати дуже низьку / високу частоту кадрів, а потім перейти від другого фільтра, який зробить відео повільного руху нормальним?)


0

У моєму випадку це було трохи складніше через цифри у файлах. Ось як виглядають мої зображення:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

і ось команда, яку я використав:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

Це можна зробити за допомогою convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Якщо ви хочете використовувати ffmpeg, я використав

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

де 10*PTSрозповідає ffmpeg уповільнити її в 10 разів. Ви також можете мати там дроби, щоб пришвидшити це.


Це просто інтерполяція вашої оригінальної послідовності зображень у новий простір, вона не створює відеофайл, як запитував ОП.
f0ster

0

-pattern_type glob конкретні приклади зі звуком

Цей параметр згадувався на веб- сайті: https://superuser.com/a/782520/128124, але ось кілька конкретних прикладів його використання, включаючи додавання аудіо до вихідного відео.

Показ слайд-шоу з одним зображенням в секунду

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Додайте до нього музику, відсікаючи звук, коли зображення закінчуються:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Ось дві демонстрації на YouTube:

Будьте хіпі та використовуйте формат відео, не обмеженого патентом Theora :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Зображення слід, звичайно, сортувати за алфавітом, як правило:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

і так далі.

Дивіться також: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Відео із звичайною швидкістю з одним зображенням на кадр при 30 кадрів в секунду

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

Ось як це виглядає:

GIF, створений за допомогою: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Додайте до нього аудіо:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Результат: https://www.youtube.com/watch?v=HG7c7lldhM4

Перетворіть один музичний файл у відео з фіксованим зображенням для завантаження на YouTube

Відповів на: Як перетворити MP3 у формат відео, дозволений Youtube?

Отримайте деякі синтетичні вхідні зображення

Це тестові зображення, які я використовував у цій відповіді:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Зображення, створені за допомогою: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Приємно спостерігати, наскільки відео стискає послідовність зображень краще, ніж ZIP, оскільки воно здатне стискати через кадри спеціалізованими алгоритмами:

  • opengl-rotating-triangle.mp4: 340К
  • opengl-rotating-triangle.zip: 7,3М

Про параметри CLI

Зауважте, що, незважаючи на назву, -globце не так загально, як оболонки Glob patters, наприклад: -i '*'fails: https://trac.ffmpeg.org/ticket/3620 (мабуть, тому, що тип файлу виводиться з розширення).

-r 30робить -framerate 1відео 30 FPS для подолання помилок у програвачах, таких як VLC для низьких кадрів: https://stackoverflow.com/questions/19267443/playback-isissue-in-vlc-with-low-fps-video-from-images-using- ffmpeg / 41797724 # 41797724 Тому він повторює кожен кадр 30 разів, щоб зберегти бажаний ефект 1 секунду.

Наступні кроки

Ви також хочете:

TODO: навчіться вирізати та об'єднати декілька аудіофайлів у відео з командного рядка:

Випробуваний на

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Бібліографія

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.