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/* |