Last active
February 5, 2025 20:37
-
Star
(173)
You must be signed in to star a gist -
Fork
(39)
You must be signed in to fork a gist
-
-
Save trvswgnr/55aa99a45781a3ff68e79b76a6ab7d70 to your computer and use it in GitHub Desktop.
portable shell script to compress videos with ffmpeg
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
print_usage() { | |
echo "usage: compress_video <input_file>" | |
echo "supported formats: mp4, webm, mkv, mov, avi, flv" | |
} | |
get_extension() { | |
f="${1##*/}" | |
case "$f" in | |
.*) get_extension "${f#.}" && return 0 ;; | |
esac | |
case "$f" in | |
.*.*) echo "${f#.}" ;; | |
*.*) echo "${f#*.}" ;; | |
*) return 0 ;; | |
esac | |
} | |
get_filepath_without_extension() { | |
ext=$(get_extension "$1") | |
echo "${1%."$ext"}" | |
} | |
if [ $# -ne 1 ]; then | |
echo "ERROR: input file is required" | |
print_usage | |
exit 1 | |
fi | |
input_file="$1" | |
if [ ! -f "$input_file" ]; then | |
echo "ERROR: input file '$input_file' does not exist" | |
exit 1 | |
fi | |
input_file_ext="$(get_extension "$input_file")" | |
output_file="$(get_filepath_without_extension "$input_file")_compressed.$input_file_ext" | |
# Default to libx264 and aac for unknown formats | |
vcodec="libx264" | |
acodec="aac" | |
format_opt="" | |
case $input_file_ext in | |
mp4) | |
vcodec="libx264" | |
acodec="aac" | |
;; | |
mov) | |
vcodec="libx264" | |
acodec="aac" | |
format_opt="-f mov" | |
;; | |
webm) | |
vcodec="libvpx-vp9" | |
acodec="libopus" | |
;; | |
mkv) | |
vcodec="libx265" | |
acodec="libopus" | |
;; | |
avi|flv) | |
vcodec="libx264" | |
acodec="aac" | |
format_opt="-f mp4" | |
output_file="$(get_filepath_without_extension "$input_file")_compressed.mp4" | |
;; | |
*) | |
echo "WARNING: unsupported video format - trying with default codecs" | |
;; | |
esac | |
echo "compressing video. this could take a while..." | |
if ffmpeg -i "$input_file" -c:v $vcodec -crf 23 -preset medium -c:a $acodec $format_opt "$output_file"; then | |
echo "compression completed successfully" | |
echo "output file: $output_file" | |
else | |
echo "ERROR: compression failed" | |
exit 1 | |
fi |
is this rust?
sorry i do not understand
is it possible to run this on my Samsung refrigerator?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I made the pwsh version for our poor Windows user (so that you don't have to install WSL).
Setting up:
notepad compress-video.ps1
.Running the script is more or less the same as the original.
.\compress-video.ps1 path-to-the-video\video-you-want-to-compress.mp4