Перетворення кадрів PNG у відео на 1 FPS


21

У мене є відеокадри у форматі PNG на 1 FPS і я намагаюся перетворити їх у відео за допомогою ffmpeg.

Якщо я роблю щось подібне:

ffmpeg -i data/input-%4d.png data/output.mp4

Я отримую відео з 25 кадрів в секунду, що в основному є дуже швидким вперед вхідного сигналу (який фіксується в 1FPS).

Якщо я спробую:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Я отримую щось, що VLC не хоче грати :)

Тепер, якщо я беру перше відео (FF) і застосую фільтр, щоб уповільнити його (наприклад -filter:v 'setpts=24.0*PTS'), я можу змусити його відтворювати як відео з 1 FPS, але, звичайно, ціна - це розмір файлу. Я думаю, це генерує купу повторних кадрів.

Отже, питання полягає в тому, як мені створити відео, яке має рівно 1 FPS і насправді відтворюється з такою швидкістю? Формат виходу, btw, не так важливий для мене.


Я не впевнений , що ffmpegце досить розумний , щоб з'ясувати , видеокодека тільки від розширення файлу формату контейнера, .mp4. Спробуйте додати -vcodec libx264 -vpre hqдо командного рядка, щоб повідомити йому параметр кодека та кодування.
Warren Young

Це насправді зрозуміло, що це нормально, і я, як згадувалося, добре працював і давав дивні результати лише тоді, коли додав -r 1.
Ассаф Лав'є

Думаю, вам може пощастить у відповіді ffmpeg на stackoverflow.com або superuser.com .
Демієн

Відповіді:


19

Якщо ви хочете, щоб однофайл для FFMPEG генерував відео, яке відтворюється зі швидкістю 1 кадр в секунду, що ви хочете зробити, це вказати рамки для вводу та виводу, наприклад:

ffmpeg -r 1 -i дані / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

Це -r 1означає, що відео відтворюватиметься з 1 початкового зображення в секунду.
В -r 10означає , що відео буде відтворюватися з частотою 10 кадрів в секунду.

(Він -pix_fmt yuv420pіснує лише для того, щоб забезпечити сумісність із широким спектром програм відтворення. Тут потрібно, наприклад, щоб відео відтворювалося Windows Media Player.)

Я протестував багато різних вихідних кадрів, і 10, здається, є найменшим числом, яке ви можете використовувати, і все одно вийде відео, яке буде відтворюватися VLC

Звичайно, вищевказана команда означає, що кожне оригінальне зображення примножується, але це простіший метод, ніж той, про який ви згадали "сповільнити його", і залежно від кодеку він може не створювати відео, набагато більше, ніж справжній 1-FPS відео.

Щоб перевірити це, я щойно створив справжнє відео 1-FPS, яке вийшло на 2,24 кіБ. Потім я створив відео з тими самими вхідними зображеннями, але вийшов при 24 кадрів в секунду, і він вийшов у 5,76 кіБ. Це трохи більше, ніж удвічі більше, і ніде майже в 24 рази більше. :)


+1 on -pix_fmt Легко забути, деякі люди наполягають на використанні WMP :-)
Smalltown2k

чому ви хочете, щоб вихідний формат був 10 кадрів в секунду, а вхід - лише 1? Чи не створило б це на 90% зайві кадри, які точно такі самі?
Герберт

@Herbert він створює зайві кадри, щоб ви могли отримати частоту кадрів до 10, що робиться так, щоб VLC не скаржився , і візуально це не змінює відео. Кодер досить розумний, щоб побачити, що кадри всі однакові, щоб ви не закінчилися з набагато більшим файлом
chiliNUT

@chiliNUT чіткий, ключовий кадр - це не всі формати, але більшість розумних форматів. Спасибі!
Герберт

5

Використовуйте і те, -framerateі-r

Наприклад, щоб було остаточне відео, яке виглядає як 1FPS:

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

Це схоже на перетворення кадрів PNG у відео з частотою 1 FPS | Unix & Linux Stack Exchange каже, але мені потрібно було -framerateзамість того, -rщоб він працював.

Про це йдеться у вікі за адресою: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Він встановлює частоту кадрів на виході 30, з якою VLC може обробляти, і копіює кожне зображення 30 разів, так що вихідний відеоролик виявляється у 1 FPS. Дивіться також: Проблеми з відтворенням у VLC з відео з низькою частотою кадрів із зображень із використанням ffmpeg | Переповнення стеку

Потім VLC може нормально відтворювати відео.

Тестовано на Ubuntu 16.10, VLC 2.2.4, ffmpeg3.0.5, у каталозі з 10 PNG.

Дивіться також: /programming/19267443/vlc-freezes-for-low-1-fps-video-create-from-images-with-ffmpeg


Яка різниця між -rі -framerate?
Рой

@Royi Я насправді не знаю, за винятком того, що це єдине, що працювало на мене :-) Але якщо вам вдалося витягнути це зі manсторінок, дайте мені знати ;-) Змістовна цитата - "-r Як параметр введення, ігноруйте будь-які часові позначки, що зберігаються у файлі, і замість цього генерують часові позначки, передбачаючи постійну частоту кадрів в кадрі. Це не те саме, що параметр -framerate, який використовується для деяких вхідних форматів, таких як image2 або v4l2 (раніше він був однаковим у старих версіях Якщо ви сумніваєтеся, використовуйте -framerate замість введення -r. "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

3

Що робити, якщо ваш другий приклад трохи збільшити так:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

В -r 1потреби прийти до .png файлів, а не після.

З документації FFmpeg :

Як правило, параметри застосовуються до наступного вказаного файлу. Тому порядок важливий, і ви можете мати один і той же варіант у командному рядку кілька разів. Кожне виникнення потім застосовується до наступного вхідного чи вихідного файлу.


На жаль, це не працює. Однак згадка про те, що порядок важливий, заощадила мені багато часу. Спасибі.
Мухаммед Нурелдін

0

Це помилка у VLC (яка все ще існує у версії 3.0.6). Після деяких експериментів я зрозумів, що VLC виходить з ладу для відео з FPS менше 10 . Тому всі відео з 10 FPS або більше не повинні бути проблемою. Тож наразі немає чистого способу отримати відео з 1 FPS, яке відтворюється у VLC ( не здавайся, читай ).

Одне вирішення - як показано у відповіді вище - підробляти ефект 1 FPS шляхом дублювання зображень (коли насправді FPS дорівнює 10 і більше, що нормально для VLC).

Приклад: якщо у вас є папка з 12 зображеннями, і ви хочете генерувати відео з 1 FPS (який може відтворюватися у VLC), вам потрібно дублювати кожне зображення кілька разів (скажімо 10 разів), а потім повідомити FFMPEG для створення 10 FPS відео. Таким чином ми отримаємо відео із загальною кількістю кадрів 120, де кожне зображення буде відтворюватися протягом 1 секунди (оскільки воно дублюється 10 разів), що є просто підробкою на 1 FPS.

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

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Оскільки вхід -framerateнижче, ніж вихід fps, FFMPEG буде дублювати кадри, щоб досягти бажаної частоти кадрів на виході (що становить 10 відповідно до команди вище).

Також важливо зауважити, що порядок -framerateі -vf fpsважливий , оскільки ця конфігурація буде застосована до наступного згаданого відео (вхід або вихід). Це згідно з офіційними документами :

параметри застосовуються до наступного вказаного файлу. Тому порядок важливий ...

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