ffmpeg:使用带有部分文件名戳覆盖(日期时间)的图像集制作电影

ffmpeg:使用带有部分文件名戳覆盖(日期时间)的图像集制作电影

我的花园里有两台相机,拍摄我感兴趣的两种植物的延时 JPEG 图像。

其中一个已经具有覆盖时间戳并且它不会给我带来问题,我每天用它制作电影:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4  -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

电影效果非常完美,图像的序列非常完美。

至于其他,我使用的方法是两步法,我想将其转换为一步法。它拍摄每张照片,在每张照片上制作一个叠加层,存储在 tmp 文件夹中,上面的脚本会从该文件夹中制作影片。

虽然它可以起作用,但是由于双重编码过程,非常耗时并且质量下降。

因此,我决定使用下面任一脚本将其变为一步到位:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text="Partial filename of each image, containing date-time": [email protected]: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

问题 1:这可行,但我无法获取正在处理的文件名以将其插入过滤器中。

还有另一种方法:

find . -type f -name '*.jpg' -exec TEST=$'{}' \; -exec cat {} \; | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text=$TEST: [email protected]: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

如您所见,目的是获取变量中的文件名,处理它,并在过滤器中使用它。

问题2这里有两个问题。第一个问题是图像没有按文件名排序,因此时间不合适。第二个问题是“find”没有像我预期的那样使用两个 exec 命令。

所以,这篇文章很长,我希望你能读完。有人能帮忙吗?

短暂性脑缺血发作

答案1

我不了解 FFmpeg,也没有它,所以我无法测试这一点。但是你说cat *.jpg(和,例如echo *.jpg)以正确的顺序给你文件。在这种情况下,你应该能够用

对于 *.jpg 中的 f
   ffmpeg -y …参数…文本=“$f”:…更多参数…-loglevel info“../video_test.mp4”<“$f”
完毕

或者,如果你坚持使用cat

对于 *.jpg 中的 f
   猫“$f”| ffmpeg -y…参数…文本=“$f”:…更多参数…-loglevel 信息“../video_test.mp4”
完毕

相关内容