短版
如何合并文件img1000.png
, img5000.png
, img10000.png
, img11000.png
以正确的顺序进入电影?
加长版
我正在使用 ffmpeg 从模拟的快照中制作电影。例如,每秒应该有 5 张图像。名称是:
image0200.png
image0300.png
image0400.png
image0500.png
image1000.png
image1500.png
image2000.png
...
image8500.png
image9000.png
image9500.png
image10000.png
image15000.png
即,它们是连续的,但数字中有不规则的间隙。这些数字的格式根据 '%04d'
但要高于 9999。我试过了ffmpeg -y -loglevel debug -nostats \
-r:v 5 -thread_queue_size 1024 -f image2 \
-pattern_type glob -i "*[0-9][0-9][0-9][0-9].png" \
-r:v 30 -preset veryslow -pix_fmt yuv420p -crf 28 \
-an AMDG.mp4
还有很多很多其他变体,但要么在电影中最终只有两帧可见(即使在使用 -debug 时找到了图像),或者只有直到 image9500.png
的文件。被使用(和 glob
似乎不允许 [0-9]{4,}
对于正则表达式),或者, ffmpeg -y -loglevel debug -nostats \
-r:v 5 \
-thread_queue_size 1024 -f image2 -pattern_type glob \
-i "image[0-9][0-9][0-9][0-9].png" \
-r:v 5 \
-thread_queue_size 1024 -f image2 -pattern_type glob \
-i "image[1-9][0-9][0-9][0-9][0-9].png" \
-r:v 30 -preset veryslow -pix_fmt yuv420p -crf 28 \
-map 0 -map 1 \
-an AMDG.mp4
输出电影中显然有两个流,并且只有一个正在播放。 (我意识到在过程中需要 -map 0 -map 1
才能使用两个输入流。)在我发现的选项变体之一中(现在我已经失去了它的本来面目!)所有图像都包括在内,但顺序不是所需的:
image1000.png
在 image10000.png
之前显示.显然,较新版本的 ffmpeg(我有 ffmpeg version 3.4.8-0ubuntu0.2
)能够像 sort -V
一样排序,所以 image10000
来吧image1000
,但重新安装 ffmpeg 通常不是一个实际的选择。重命名文件也不实用,并且创建例如具有从 0 开始并以 1 为步长的 '%05d' 格式的顺序名称的软链接(soft link)(因此可以使用 -i '%05d'
)当然并不优雅。与
-concat
过滤器如 https://unix.stackexchange.com/questions/77016/ffmpeg-pattern-type-glob-not-loading-files-in-correct-order , IE。, ffmpeg -y -loglevel debug -nostats -r:v 5 \
-thread_queue_size 1024 -f image2 -f concat \
-safe 0 -i <(find . -maxdepth 1 -regex 'image*.png' \
-exec echo "file $(pwd)/"{} \; | sort -V) \
-r:v 30 -codec:v libx264 -preset veryslow -pix_fmt yuv420p -crf 28 \
-an \
AMDG.mp4
处理时间很长,使整个系统变得迟缓,同时制作了约 60 kB 的电影,只显示了两个不同的图像。我的印象是一次有几个问题......如果你能提供帮助,谢谢!
最佳答案
最终真正的问题是,尝试不同的事情会导致我相互覆盖源 PNG 图像,从而导调用影中图像的看似和明显不正确的重复。
作为引用,以正确顺序放置图像的工作命令(不直接使用 -filter image2 -pattern_type glob -i "*.png"
)是:
ffmpeg -y -loglevel warning \
-r:v 5 -f concat -safe 0 \
-i <(find . -maxdepth 1 -name '*.png' \
-exec echo "file $(pwd)/"{} \; | sort -V \
| sed 's/$/\nduration 1.0/' | tee list.txt) \
-vf fps=30 -codec:v libx264 -preset veryslow \
-pix_fmt yuv420p -crf 28 \
-an AMDG.mp4
在哪里:-y
不询问就覆盖输出文件; -r:v 5
每秒使用 5 个输入图像; -maxdepth 1
部分避免在子目录中查找文件(适应口味); sed
部分替换( s
)每行结束和换行符( $
)用换行符( \n
)后跟 duration 1.0
(数字似乎是任意的)在每个 file XXXX
之后find
的隐式输入文件中的行正在 build 。此列表为调试而保存到 list.txt
;删除 | tee list.txt
不要这样做; safe 0
实际上是安全的,并且允许文件路径包含 ./
由 find
返回. 如果您的输入文件名包含空格,您将需要使用进程重定向部分。
关于video - 以正确的顺序用图片制作电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70347591/