video - 以正确的顺序用图片制作电影

标签 video ffmpeg wildcard

短版
如何合并文件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.pngimage10000.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/

    相关文章:

    audio - 将音频kb/s不一致的TS文件合并为一个音频一致的文件

    FFMPEG 的 FLAC 压缩级别和默认设置

    c++ - 使用 FFMPEG 读取每帧时间码?

    c++ - OpenCV IP 摄像机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    python - Snakemake:通配符不存在时出错

    具有复合键和通配符的 Java 泛型

    python - 从python中的视频中提取音频

    javascript - 如何通过 API "input type=' 文件'“标记...NO Jquery 或外部库更改本地文件的视频源

    ruby-on-rails - rails : Paperclip produces different results for similar videos

    java - 使用通配符 (*) 匹配的递归文件搜索