Функция ImageMagik "конвертировать" не может обрезать более 300 файлов одновременно

Я работаю над созданием видео Timelapse. Все фотографии сделаны в формате.jpg, снятом с соотношением сторон 4:3. Разрешение 2592x1944. Я хочу, чтобы они были 16:9 в 1920x1080.

Я написал небольшой сценарий для этого, а также собрал видео, но у меня проблемы!

Этот скрипт отлично работает, когда у меня меньше 300 файлов, но когда у меня больше этого, команда "конвертировать", которую я использую для обрезки изображений, просто пожирает всю память и замораживает мой компьютер (с 8 ГБ ОЗУ), все без обрезки одно фото!

Всего около 300 000 фотографий... которые я планирую сделать партиями по 50 000 фотографий каждая. Так что это, очевидно, проблема, которую необходимо преодолеть. Но сейчас я тестирую около 700 фотографий.

Вот сценарий, который я написал. Я использую Ubuntu 14.04

Обратите внимание, что я идентифицировал проблему как возникающую во время функции "convert". Это все еще случается, если я запускаю это вне остальной части сценария.

mkdir resized

echo Begin Resizing!
mogrify -path resized -resize 1920x1440! *.JPG #Resizes all files, maintaining 4:3 aspect ratio

echo Resizing Complete! Begin Cropping!
cd resized
convert *.JPG -crop 1920x1080+0+$1 D$2P$3 #Crops all 4:3 files to 16:9 aspect ratio. Takes command line arguments for cropping dimensions and filename (Memory leaks, can't crop ? 300 images!)

echo Cropping Complete!
mkdir cropped
mv D* cropped/ #Moves all cropped photos into new directory
cd cropped
find . -type f -exec mv '{}' '{}'.JPG \; #Adds '.JPG' to each filename
ls *.JPG -1tr > files.txt #Creates List of files

echo MAKING VIDEO!
mencoder -nosound -noskip -oac copy -ovc copy -o output.avi -mf fps=30 'mf://@files.txt' #Creates .avi video from jpg images (very fast)
#avconv -i output.avi -c:v libx264 -preset slow -crf 15 output-final.mkv #Converts .avi to .mkv video (Very Slow - looking for better method than making 2 vids)

echo ---------
echo ALL DONE! 
echo ---------

Я поиграл с этим и обнаружил, что 300-350 изображений, кажется, где он полностью зависает компьютер.

Эта проблема - моя самая большая проблема, но есть еще две проблемы, которые в некоторой степени связаны. Решение первого может включать обход этой проблемы.

  1. В настоящее время я изменяю размер каждой фотографии, сохраняю ее как новый файл, а затем обрезаю ее, сохраняя в качестве еще одного файла. Так как я собираюсь работать с ~50 000 фотографий одновременно... это станет громоздким. В любом случае я могу обрезать и изменить размер фотографии одновременно? Важно, однако, что я могу указать точное место, где фотографии обрезаются. Я не могу просто обрезать равные количества сверху и снизу.

  2. В настоящее время я превращаю это в видео в единственном процессе, который я смог получить - создание файла.avi из jpgs, а затем создание второго видео, преобразованного из этого. Это также очевидный ненужный шаг, но я не уверен, как получить доступ к.mkv (или лучше к.mp4). Эта проблема может оказаться спорным, так как я смотрю в нетерминальные решения, чтобы сделать фактическое видео из фотографий (а именно Sony Vegas и GoPro студия).

2 ответа

Замените *.JPG на цикл для ваших файлов, чтобы каждый раз конвертировался. Таким образом, вы избежите проблемы.

Пример (не проверено):

#!/bin/bash
FILES=/path/to/*.JPG
for f in $FILES
do
    convert $f -crop 1920x1080+0+$1 D$2P$3
done

Может быть, это помогает установить некоторые ограничения на память и определить временный путь.

Таким образом, я без проблем сделал около 1200 изображений.

convert -monitor -limit memory 2GiB -limit map 4GiB -define registry:temporary-path=/data/tmp *.JPG -crop 1920x1080+0+$1 D$2P$3

http://www.imagemagick.org/script/command-line-options.php

http://www.imagemagick.org/script/command-line-options.php

Другие вопросы по тегам