我正在尝试制作一个脚本,使用ffmpeg将一堆间隔拍摄图像转换为电影。
最新的问题是如何循环播放图像,比如批量为500。
当天可能有100张图片,或者可能有5000张图片。
将此分开的原因是由于内存不足。
之后我需要使用MP4Box将它们连接在一起......
我对bash完全不熟悉,但不完全是编程。
我认为需要发生的是这个
1)读入文件夹内容,因为图像可能无法连续命名
2)一次发送ffmpeg 500个列表进行处理(https://trac.ffmpeg.org/wiki/Concatenate)
2b)当您通过此循环时,设置一个计数器以确定您已经完成了多少循环
3)使用循环次数创建MP4Box cat命令行,最后将它们全部连接起来。
如果只有500张图片可以使用的基本脚本:
#!/bin/bash
dy=$(date '+%Y-%m-%d')
ffmpeg -framerate 24 -s hd1080 -pattern_type glob -i "/mnt/cams/Camera1/$dy/*.jpg" -vcodec libx264 -pix_fmt yuv420p Cam1-"$dy".mp4
MP4Box的cat命令如下:
MP4Box -cat Cam1-$dy7.mp4 -cat Cam1-$dy6.mp4 -cat Cam1-$dy5.mp4 -cat Cam1-$dy4.mp4 -cat Cam1-$dy3.mp4 -cat Cam1-$dy2.mp4 -cat Cam1-$dy1.mp4 "Cam1 - $dy1 to $dy7.mp4"
毋庸置疑,我的项目非常感谢帮助
答案 0 :(得分:0)
这是让你入门的东西。它将各个帧按时间顺序排序,然后将它们分块为500块并循环遍历所有块:
#!/bin/bash
# User-changeable number of frames per chunk
chunksize=500
# Rename files by date/time so they collate in order
jhead -n%Y-%m-%d_%H-%M-%S *.jpg
# Remove any remnants from previous runs (which may have been longer)
rm chunk* sub-*mp4
# Split filename list into chunks - chunkaa, chunkab, chunkac ...
ls *jpg | split -l $chunksize - chunk
# Put 'file' keyword before each filename
sed -i.bak 's/^/file /' chunk*
n=0
for c in chunk*; do
# Generate zero-padded output filename so that collates for final assembly too
out=$(printf "sub-%03d.mp4" $n)
echo Processing chunk $c into sequence $out
ffmpeg -f concat -i "$c" ... "$out"
((n+=1))
done
# Final assembly of "sub-*.mp4"
ffmpeg ... sub-*mp4 ...