0

我正在尝试制作一个脚本,使用 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"

不用说,我的项目非常感谢帮助

4

1 回答 1

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 ...
于 2017-03-02T10:50:21.667 回答