将影像拍摄成电影,一次500张

时间:2017-03-02 06:14:49

标签: bash ffmpeg timelapse

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

毋庸置疑,我的项目非常感谢帮助

1 个答案:

答案 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 ...