Перетворити тисячі .pngs в анімований .gif, `convert` використовує занадто багато пам'яті


29

Багато питань, що задають, як створити анімований gif з набору зображень PNG, пропонують використовувати варіант команди ImageMagick convert:

convert -delay 2 -loop 0 *.png animated.gif

Однак у мене є кілька тисяч зображень, і таким чином convertвикористовується вся моя пам’ять, обмінюватися, а потім виходить з ладу. Яке альтернативне програмне забезпечення існує, яке є більш пам'ятним? Я можу використовувати інший відкритий формат, якщо .gifвін не підтримується, і я віддаю перевагу інструменту CLI.


1
Як щодо поділу файлів * .png на керовані фрагменти? Скажімо, всі назви файлів починаються з цифри, а потім convert -delay 2 -loop 0 0*.png animated.gifконвертують лише файли, які починаються з "0". І так далі.
Джос

2
Отже, кожен .png знаходиться в порядку 1 Мб? У цьому випадку все, що я можу придумати - це спершу перетворити .png файли на меншу роздільну здатність або глибину кольору, щоб зменшити їх.
Джос

10
Ви кажете, що ви могли використовувати інший відкритий формат. Мені здається, що gif - це не найкращий формат для тисяч кадрів. Чи розглядали ви замість цього кодування відео за допомогою Ogg Theora?
rekado

1
Можливо, погляньте на gifsicle , якщо ви дійсно хочете використовувати GIF? (Хоча, як говорили інші, GIF не для цього був зроблений; OGG був би кращим вибором.)
wchargin

1
Re. "куди збирається вся пам'ять": 65 Кб - це розмір файлу стисненого зображення. Якщо не стискається, зображення займає приблизно 4 х ширини х байтів висоти, тому зображення 1024x768 займе ~ 3 Мб оперативної пам'яті. Помножте це на «кілька тисяч», і побачите, куди йде пам’ять ...
Сергій

Відповіді:


33

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

У цьому випадку я використовую ffmpeg для перетворення окремих файлів PNG у відео H.264. Оскільки ffmpeg створений для роботи з відео, яке може тривати довгими годинами, це не повинно мати проблем з вашими тисячами зображень. Використання H.264 замість анімованих gif призведе до значного поліпшення якості зображення.

Щось подібне повинно працювати для вас:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: Це встановлює частоту кадрів в половину FPS або 2 секунди на кадр.
  • -i img%04d.png: Це говорить FFmpeg для читання файлів , img0000.pngхоча img9999.png.
  • -c:v libx264: Використовуйте відео кодек libx264.
    • Тут можна вказати параметри стиснення відео, якщо вам подобається:
    • -crf <number>: Налаштування якості. 0 до 51. 23 є за замовчуванням. 0 - справжнє кодування без втрат, яке буде досить високою пропускною здатністю. 18 майже не втрачає зору.
  • -r 30: Встановити вихідну частоту кадрів в 30 FPS. Кожне з вхідних зображень буде дублюватись, щоб зробити вихід таким, що ви вказали тут. Ви можете залишити цей параметр вимкненим, і вихідний файл буде знаходитись у вхідній рамці, але отриманий фільм не відображався належним чином, коли я його спробував зараз.
  • out.mp4: Вихідне ім'я файлу.

Список літератури:


1
Приємне розширення відповіді Франтік за день до цього.
Старійшина Гек

Ось простий тест ffmpeg vs ImageMagick з конкретними даними тесту: askubuntu.com/questions/648244/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

11

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

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif

8

Використовуйте -limit memory 1GiBдля обмеження обсягу використання пам'яті convert.

1000 зображень створили б величезний GIF, який більшість комп'ютерів буде намагатися відображати. Я зберігаю свої анімовані GIF-файли нижче 200 зображень, коли це можливо. Чим менше, тим краще. Якщо пронумерувати ваші зображення, ця команда видалить непарні номери rm *[13579].png.

Отже, ось мій типовий робочий процес для створення анімаційного GIF зі сцени фільму:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif

1
Дякую, це рішення працює добре. Він також може бути необхідно збільшити допустимі межі пам'яті в /etc/ImageMagick-6/policy.xml см github.com/ImageMagick/ImageMagick/issues / ... для отримання додаткової інформації
Луї Ганьон

4

Я можу використовувати інший відкритий формат, якщо .gifвін не підтримується

Можливо, APNG вам корисний . Він підтримується деякими веб-переглядачами , зокрема Firefox, але наразі виключає Chrome та IE. Оскільки це лише розширення PNG, конвертувати PNG в APNG дуже просто. Інструмент апнгазму може це зробити. Але формат настільки простий, що я нещодавно написав асемблер APNG сам для Sage. Адаптація цього коду була б альтернативою.


Я хотів би також зазначити, що APNG є нестандартним, і незважаючи на те, що існував протягом 7 років, все ще дуже незрозумілий.
Фарап

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

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

3

Якщо у вас є тисячі png-s, формат anigif є дивним. Я зробив би це таким чином, використовуючи avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

Такий підхід має додаткову перевагу, що згодом ви зможете запускати звук під час передачі голосу чи музики, що неможливо із форматом графічної взаємодії.
Старійшина Гейк

2

gifsicle - це утиліта командного рядка для обробки анімації GIF. Якщо ви готові торгувати пам'яттю на швидкість, ви можете скористатися її перемикачем - conserve-memory.


Дозвольте мені сказати так: gifsicle вже має меншу площу , ніж ImageMagick - якщо ви виявите , що вона по- , як і раніше використовує занадто багато пам'яті для виконання цього завдання під рукою, то ви можете використовувати --conserve-пам'ять
codehead

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

2

На додаток до інших відповідей: оскільки ви хочете створити файл GIF, я припускаю, що ви хочете відобразити зображення на веб-сторінці. Якщо так, я б взагалі не переймався перетворенням ваших PNG-файлів. Просто google для "слайд-шоу JavaScript" і використовуйте один з мільйонів безкоштовних сценаріїв. Або напишіть своє, це справді банально.

Переваги цього способу:

  • у браузер завантажується лише одне зображення в будь-який час, слайд-шоу починається швидко і не споживає багато оперативної пам’яті на машині користувача.

  • рішення масштабує мільйони зображень. Або мільярди, якщо ви досить терплячі, щоб переглядати їх усіх :)

  • Ви можете додати елементи керування на свою сторінку, щоб призупинити, перемотати назад, змінити затримку або перейти до певного кадру.


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