#!/bin/sh # ffmpeg compression & encoding for multiple use cases : "${modes:=youtube small}" help() { printf "\n\033[1m"Usage:"\033[0m\n" printf " ffmpeg-compress [Video] [Preset] [optional:resolution@framerate]" printf "\n\033[1m"Presets:"\033[0m\n" for mode in "$modes" ; do printf " $mode" ; done echo exit } input="$1" # Filename suffix=${input##*.} # Suffix preset="$2" # Preset # File and/or mode not given [ -z "$preset" ] && help res=${3%%@*} # Resolution from 3rd argument frm=${3##*@} # Framerate from 3rd argument # (File's current settings otherwise) [ -z "$res" ] && res=$(ffmpeg -i "$input" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+') [ -z "$frm" ] && frm=$(ffmpeg -i "$input" 2>&1 | sed -n "s/.*, \(.*\) tbr.*/\1/p") # YouTube # Use parameters found in 'https://support.google.com/youtube/answer/1722171#zippy=' # and 'https://gist.github.com/mikoim/27e4e0dc64e384adbcb91ff10a2d3678' # to determine proper youtube upload encoding. encode_youtube() { output=${input%".$suffix"}-encode-yt.mp4 ffmpeg -i "$input" \ -movflags faststart \ -c:v libx264 \ -profile:v high \ -bf 2 \ -g 30 \ -crf 24 \ -pix_fmt yuv420p \ -c:a aac \ -profile:a aac_low \ -b:a 384k \ "$output" } # Sensible settings for good quality # while encoding a smaller file size compress_small() { output=${input%".$suffix"}-compress-small.mp4 ffmpeg -i "$input" \ -profile:v baseline \ -pix_fmt yuv420p \ -movflags faststart \ -vcodec libx264 \ -crf 28 \ -c:a aac \ -b:a 128k \ "$output" } # Run chosen preset, exit if there's an error in process [ "$preset" = "youtube" ] && encode_youtube [ "$preset" = "small" ] && compress_small # Given preset was not found echo "'$preset' is not a valid preset" && help