Folder structure
|-/input #Still images
|-/frames #Converted and resized frames
|-/output
|- video.mp4
#!/bin/bash | |
AWS_BUCKET="none" | |
FPS=30 # = 1/sec | |
### | |
# Set constants | |
### | |
RAW_FRAMES_FOLDER=input | |
IMAGES=($RAW_FRAMES_FOLDER/*) #store images in 0-index array | |
INTERMEDIATE_FRAMES_FOLDER=frames | |
VIDEO_OUTPUT_FOLDER=out | |
VIDEO_OUTPUT_FILE=video.mp4 | |
### | |
# Initialization | |
### | |
mkdir -p $RAW_FRAMES_FOLDER $INTERMEDIATE_FRAMES_FOLDER $VIDEO_OUTPUT_FOLDER | |
#aws s3 sync s3://$AWS_BUCKET $RAW_FRAMES_FOLDER #import frames from S3 | |
### | |
# Convert frames | |
### | |
for i in "${!IMAGES[@]}"; do | |
SRC=${IMAGES[$i]} | |
DEST=$(printf "%s/%03d.jpg" $INTERMEDIATE_FRAMES_FOLDER $((i+1))) | |
#Pad and center | |
ffmpeg -i $SRC \ | |
-vf "pad=max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2" \ | |
$DEST | |
done | |
#Can't figure out how to make the final input frame last more than a single output frame | |
#so for now it's just duplicated | |
FRAME_COPY=$(printf "%s/%03d.jpg" $INTERMEDIATE_FRAMES_FOLDER $((i+2))) | |
cp $DEST $FRAME_COPY | |
### | |
# Encode video | |
### | |
ffmpeg \ | |
-r 1 \ | |
-i "$INTERMEDIATE_FRAMES_FOLDER/%03d.jpg" \ | |
-vf "fps=$FPS,scale=500:500,format=yuv420p" \ | |
-codec:v libx264 \ | |
"$VIDEO_OUTPUT_FOLDER/$VIDEO_OUTPUT_FILE" | |
### | |
# Clean up | |
### | |
rm -rf $INTERMEDIATE_FRAMES_FOLDER/* #$RAW_FRAMES_FOLDER/* |