Skip to content

Instantly share code, notes, and snippets.

@emilbayes
Created June 19, 2014 13:59
Show Gist options
  • Save emilbayes/b1476a0024053f7f27c8 to your computer and use it in GitHub Desktop.
Save emilbayes/b1476a0024053f7f27c8 to your computer and use it in GitHub Desktop.
Convert images to video slideshow
#!/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/*

Folder structure

|-/input #Still images
|-/frames #Converted and resized frames
|-/output
  |- video.mp4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment