molly78
molly78

Reputation: 23

timelapse images into a movie, 500 at a time

I am trying to make a script to turn a bunch of timelapse images into a movie, using ffmpeg.

The latest problem is how to loop thru the images in, say, batches of 500.

There could be 100 images from the day, or there could be 5000 images.

The reason for breaking this apart is due to running out of memory.

Afterwards I would need to cat them using MP4Box to join all together...

I am entirely new to bash, but not entirely programming.

What I think needs to happen is this

1) read in the folders contents as the images may not be consecutively named

2) send ffmpeg a list of 500 at a time to process (https://trac.ffmpeg.org/wiki/Concatenate)

2b) while you're looping thru this, set a counter to determine how many loops you've done

3) use the number of loops to create the MP4Box cat command line to join them all at the end.

the basic script that works if there's only say 500 images is:

#!/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's cat command looks like:

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"

Needless to say help is immensely appreciated for my project

Upvotes: 0

Views: 660

Answers (1)

Mark Setchell
Mark Setchell

Reputation: 207853

Here is something to get you started. It sorts the individual frames into time order, and then chunks them up into chunks of 500 and loops through all the chunks:

#!/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 ...

Upvotes: 0

Related Questions