0

我正在制作一个视频游戏中时光倒流。我拍摄的所有照片都是以 4:3 纵横比拍摄的 .jpg 图像。2592x1944 分辨率。我希望它们在 1920x1080 时为 16:9。

我已经写了一个小脚本来做到这一点,以及拼凑一个视频,但我遇到了问题!

当我的文件少于 300 个时,此脚本效果很好,但当我有更多文件时,我用来裁剪图像的“转换”命令只会占用所有内存并冻结我的计算机(使用 8GB RAM),所有这些都没有裁剪一张照片!

总共有大约 300,000 张照片……我计划分批制作,每批大约 50,000 张照片。所以这显然是一个必须克服的问题。但现在我正在测试大约 700 张照片。

这是我写的脚本。我正在运行 Ubuntu 14.04

请注意,我已将问题确定为在“转换”功能期间发生。如果我在脚本的其余部分之外运行它,它仍然会发生。

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. 我目前正在将其制作成视频,这是我可以开始工作的唯一过程 - 从 jpg 制作一个 .avi 文件,然后制作从该文件转换而来的第二个视频。这也是一个明显不必要的步骤,但我不确定如何直接访问 .mkv(或者更好的 .mp4)。这个问题最终可能没有实际意义,因为我正在研究非终端解决方案以从照片中制作实际视频(即 Sony Vegas 和 GoPro Studio)。

4

2 回答 2

0

也许它有助于对内存设置一些限制并定义一个临时路径。

我以这种方式做了大约 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#limit

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

于 2015-03-15T15:03:16.863 回答
0

将 *.JPG 替换为文件的循环,以便每次都退出转换。这样你就避免了这个问题。

示例(未经测试):

#!/bin/bash
FILES=/path/to/*.JPG
for f in $FILES
do
    convert $f -crop 1920x1080+0+$1 D$2P$3
done
于 2015-03-15T04:44:12.653 回答