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


163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

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

img001.jpg
img002.jpg
img003.jpg
...

Як я можу вводити файли зображень з іншої папки? Приклад:C:\mypics

Я спробував цю команду, але ffmpegстворив відео лише з першим зображенням (img001.jpg).

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Відповіді:


167

Дивіться Створення слайд-шоу відео з зображень - FFmpeg

Якщо ваше відео не відображає кадри правильно. Якщо у вас виникли проблеми, такі як перше зображення пропускається або відображається лише для одного кадру, тоді використовуйте відеофільтр у форматі fps замість -r для вихідного кадрів

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Альтернативно, відеофільтр формату може бути доданий до ланцюжка фільтрів, щоб замінити -pix_fmt yuv420p, наприклад "fps = 25, format = yuv420p" . Перевага цього методу полягає в тому, що ви можете контролювати, який фільтр виходить першим

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Я тестував нижче параметрів, він працював на мене

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

нижче параметри також працювали, але це завжди пропускає перше зображення

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

створення відео із зображень, розміщених у різних папках

Спочатку додайте шляхи зображення до imagepaths.txt, як показано нижче.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Використання зразка наступним чином;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

Параметр -safe 0 запобігає помилці імені файлу Небезпечний

Пов'язані посилання

FFmpeg робить відео з зображень, розміщених у різних папках

FFMPEG Проміжний посібник / послідовність зображень

Concatenate - FFmpeg


"Якщо ваше відео не відображає кадри правильно. Якщо у вас виникли проблеми, наприклад, пропущено перше зображення або відображається лише один кадр, тоді замість цього скористайтеся відеофільтром fps. відеофільтр "саме?
arnuschky

3
Наскільки я знаю –r параметр є змінною частотою кадрів, це означає, що FFMPEG може скидати або дублювати кадри для досягнення бажаної вихідної частоти кадрів. Використовуючи фільтр fps "-vf fps = значення", змушуйте FFMPEG створювати постійну частоту кадрів. Див. Створення слайд-шоу відео із зображень - FFmpeg , і в чому полягає (технічна) різниця між -r та фільтром fps? . Отже, використовуючи параметр -r, іноді кузером пропускають перше зображення ..
хан

Перша команда у цьому списку, ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4здавалося, спрацювала, але врешті-решт виникла відеозапис, який не читав жоден програвач (на Ubuntu). ВНК сказав: "атом moov не знайдено". Намагаючись виправити це за qt-faststartдопомогою помилки "останній атом у файлі не був атом moov"
sh37211

149

-pattern_type glob

Цей чудовий варіант полегшує вибір зображень у багатьох випадках.

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

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

і так далі.

Я також спочатку переконаюся, що всі використовувані зображення мають однакове співвідношення сторін, можливо, попередньо обрізавши їх imagemagickабо номаки , так що ffmpeg не доведеться приймати важкі рішення. Зокрема, ширина повинна ділитися на 2, інакше перетворення не вдається: "ширина не ділиться на 2".

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

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

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

GIF, створений за допомогою: /ubuntu/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

Це тестовий носій, який я використав: a

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

Зображення, згенеровані за допомогою: Як використовувати GLUT / OpenGL для візуалізації у файл?

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

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

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

Відповів за адресою: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Повна реалістична настройка тематичного слайд-шоу крок за кроком

Для створення слайд-шоу є трохи більше, ніж виконання однієї команди ffmpeg, тому тут подається більш цікавий докладний приклад, натхненний цією шкалою .

Отримайте вхідний носій:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

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

identify png/*

який виводить:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

тому класичне співвідношення сторін 480p (640x480 == 4/3) здається відповідним.

Зробіть одну конверсію з мінімальними розмірами, щоб зробити ширину рівномірною (TODO автоматизується для будь-якої ширини, тут я просто вручну подивився на identifyвихід та зменшив ширину та висоту на одну):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Це дає жахливий вихід, тому що, як видно з:

ffprobe raw.mp4

ffmpeg просто приймає розмір першого зображення, 556x494, а потім перетворює всі інші на той самий розмір, порушуючи їх співвідношення сторін.

Тепер давайте перетворимо зображення в цільове співвідношення сторін 480p автоматично, обрізаючи відповідно до ImageMagick: як мінімально обрізати зображення до певного співвідношення сторін?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Тож тепер співвідношення сторін добре, але неминуче потрібно було зробити обрізку, яка нарізала цікаві частини зображень.

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

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Взагалі кажучи, ви в ідеалі зможете вибрати зображення з однаковими або подібними співвідношеннями сторін, щоб уникнути цих проблем в першу чергу.

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

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

-r 30робить -framerate 1відео 30 FPS для подолання помилок у програвачах, таких як VLC для низьких кадрів: VLC заморожується для низького 1 FPS відео, створеного із зображень з ffmpeg. Тому він повторює кожен кадр 30 разів, щоб зберегти бажаний ефект 1 зображення в секунду.

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

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

TODO: навчіться вирізати та об'єднати кілька аудіофайлів у відео без проміжних файлів, я впевнений, що це можливо:

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

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

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


Якщо ви використовуєте python та subprocess.call для запуску ffmpeg, вам не слід використовувати одиничні лапки 'у назвах вхідних та вихідних файлів. Інакше файли не знайдуть.
RunOrVeith

Це було б чудово для мене, але моя збірка з npm-пакету ffmpeg-staticне реалізує глобальну. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmtвикликав Trailing options were found on the commandline.помилку
Ентоні Конг

@AnthonyKong я не зміг відтворити програму ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4Ubuntun 19.10 ffmpeg 4.1.4, яка версія та точна команда?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

20

Проста версія з Документів

Особливо чудово підходить для зображень Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
Не вдається відтворити цей вихід: [h264 @ 0x7f148cc3cc40] апаратний прискорювач не вдався розшифрувати зображення
Брам

привіт, як я можу виконати цю команду, я просто знаходжу, що ви можете мені допомогти?
Невинний

@Innocent з вашого терміналу або консолі.
Джошуа Пінтер

зрозумів, що людина, але проект% 3d.png не вибрав усі мої зображення в папці з назвою Project001.png, Project002.png і так далі, отримайте лише 2 зображення, що мені робити, щоб отримати всі мої фотографії та перетворити їх у відео
Невинний

Ви використовуєте %3dабо %03d?
Джошуа Пінтер

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