Устранить фактор медленной скорости в командах ffmpeg и image-magic - PullRequest
0 голосов
/ 23 октября 2018

Основная идея этих команд - создать сравнение (сравнение определило jpeg из прошлого и одно из настоящего, объедините их так, чтобы они скользили друг на друга и показывали перед изображениями после.)

например https://media.evercam.io/v1/cameras/1lowe-scnoe/compares/lower-jreyh.gif

Все команды написаны ниже, выполняя эти операции

  • Изменить размер до после изображения.
  • создать GIF с использованием обоих изображений.
  • Добавить журнал в Gif.
  • Создать файл MP4 из GIF.
  • Создать миниатюру из файла mp4.

логотип:

enter image description here

мы создаем файлы анимации и mp4 с помощью команд FFmpeg и ImageMagick, таких как

ffmpeg -i before_image.jpg -s 1280x720 before_image_resize.jpg

ffmpeg -i after_image.jpg -s 1280x720 after_image_resize.jpg

Указанные выше команды являются первымиизменить размер обоих изображений, которые будут использоваться в анимации.

Эта команда используется для создания рисунка.

convert after_image_resize.jpg before_image_resize.jpg -write mpr:stack -delete 0--1 mpr:stack'[1]' \\( mpr:stack'[0]' -set delay 25 -crop 15x0 -reverse \\) mpr:stack'[0]' \\( mpr:stack'[1]' -set delay 27 -crop 15x0 \\) -set delay 2 -loop 0 temp.gif

Эта команда добавляет логотип к анимации.

convert temp.gif -gravity SouthEast -geometry +15+15 null: evercam-logo.png -layers Composite compa-efxfphu.gif

Затем создать файл mp4 как

ffmpeg -f gif -i compa-efxfphu.gif -pix_fmt yuv420p -c:v h264_nvenc -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' compa-efxfphu.mp4

, а затем создать эскиз дляВ этом mp4.

ffmpeg -i compa-efxfphu.mp4 -vframes 1 -vf scale=640:-1 -y thumb-compa-efxfphu.jpg

Есть ли возможность уменьшить любой из этих шагов?Все это занимает много времени, меня просто интересуют обе команды convert, можем ли мы сделать их одной командой?

Или вы видите какой-нибудь шанс уменьшить все эти 4 в одном?любой вклад будет так благодарен.

1 Ответ

0 голосов
/ 23 октября 2018

Обновленный ответ

Вот мой лучший снимок, он проходит примерно в 50% времени от первоначального ответа ...

convert -depth 8 -gravity southeast -define jpeg:size=1280x720   \
   logo.png   -write MPR:logo +delete                            \
   \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \)   \
   \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \)   \
   +append -quantize transparent -colors 250 -unique-colors +repage -write MPR:commonmap +delete \
   MPR:after  -map MPR:commonmap +repage -write MPR:after  +delete \
   MPR:before -map MPR:commonmap +repage -write MPR:before         \
              \( MPR:after -set delay 25 -crop 15x0 -reverse \)    \
   MPR:after  \( MPR:before -set delay 27 -crop 15x0         \)    \
   -set delay 2 -loop 0 -write anim.gif                            \
   -delete 1--1 -resize 640x thumb.jpg

Вот мое мышление ...

  • установите глубину 8, как мы используем JPEG, установите gravity и инициализируйте libjpeg ' "сжатие при загрузке"
  • загрузите логотип и сохраните его в MPR, поскольку мы будем использовать его дважды,
  • начнем "обработку в стороне" внутри (...) для загрузки before изображение, измените его размер, вставьте логотип и сохраните в MPR для последующего использования,
  • повторите предыдущий шаг для after изображения,
  • добавьте изображения до и после вместе и рассчитайтекомбинированная цветовая карта, подходящая как для сохранения, так и для нее,
  • отображение как до, так и после изображений на новую, комбинированная цветовая карта,
  • удаление всего мусора,
  • односторонняя анимация,
  • анимация другого,
  • делает анимацию бесконечной и сохраняет анимацию в GIF,
  • удаляет все, кроме первого кадра, изменяет размер и сохраняет какминиатюра.

Оригинальный ответ

Работа еще не завершена, но вы можете избежать первых двух вызовов ffmpeg и выполнить изменение размерав ImageMagick , а также вставьте логотипы сверху за один раз:

convert -gravity southeast logo.png  -write MPR:logo \
  \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
  \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \) \
  -delete 0--1                                           \
  MPR:before  \( MPR:after  -set delay 25 -crop 15x0 -reverse     \) \
  MPR:after   \( MPR:before -set delay 27 -crop 15x0   \) \
  -set delay 2 -loop 0 temp.gif

Вероятно, вы также можете создать эскиз с помощью этой команды, если вы изменитепоследняя строка из:

-set delay 2 -loop 0 temp.gif

до

-set delay 2 -loop 0 -write temp.gif \
-delete 1--1 -resize 640x thumbnail.jpg

Вы также можете ускорить процесс и уменьшить использование памяти, используя libjpeg "shrink-on-load" особенность.Как правило, перед чтением с диска вы указываете, насколько большой файл вам нужен, и он считывает только подмножество файла, тем самым сокращая время ввода-вывода и нагрузку на память:

convert -gravity southeast logo.png  -write MPR:logo    \
  \( -define jpeg:size=1280x720 before.jpg -resize ... \
  \( -define jpeg:size=1280x720 after.jpg  -resize ... 

Это сокращает время примерно на 25-30% на моей машине.


Вот мое мышление ...

  • сначала установите gravity, так как это настройка и остается неизменной,
  • загрузите логотип и сохраните его в MPR, потому что нам нужно будет вставить его дважды, а чтение с диска дважды будет медленным,
  • запустить "обработку в стороне" внутри (...)чтобы загрузить изображение before, измените его размер, вставьте логотип и сохраните в MPR для дальнейшего использования,
  • повторите предыдущий шаг для изображения after,
  • удалите все ненужные файлы,
  • анимировать в одну сторону,
  • анимировать в другую,
  • сделать анимацию бесконечной и сохранять анимацию в GIF,
  • удалить все, кроме первого кадра, изменить размер исохранить как эскиз.

enter image description here


Ключевые слова: aанимация, эффект стеклоочистителя, анимированный GIF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...