Skip to content

Instantly share code, notes, and snippets.

@mkatychev
Last active March 22, 2024 18:57
Show Gist options
  • Save mkatychev/c1edf136ad36bc137134d098198903b3 to your computer and use it in GitHub Desktop.
Save mkatychev/c1edf136ad36bc137134d098198903b3 to your computer and use it in GitHub Desktop.
Concatenate and convert differently sized videos into one
#!/usr/bin/env bash
join_files() {
local input_n=()
local scale_to_n=("$SEP")
local concat_n=()
for i in $(seq $#); do
input_n+=("-i ${!i}")
((n = i - 1))
concat_n+=("[v${n}][${n}:a]")
local scale_to=""
scale_to+="[${n}:v]scale=$SCALE:force_original_aspect_ratio=decrease:eval=frame,"
scale_to+="pad=$SCALE:-1:-1:color=black[v${n}];$SEP"
scale_to_n+=("$scale_to")
done
local filter_complex=""
filter_complex+="${scale_to_n[*]}"
filter_complex+="${concat_n[*]}"
filter_complex+=" concat=n=$#:v=1:a=1 [v] [a]"
# shellcheck disable=SC2068
command $FFMPEG ${input_n[@]} -n -filter_complex "$filter_complex" \
-map "[v]" -map "[a]" -s hd480 -vcodec libx264 "$OUT_FILE"
}
FFMPEG="ffmpeg"
ARGS=()
SEP=""
while [[ $# -gt 0 ]]; do
case "$1" in
--scale)
SCALE="$2"
shift
shift
;;
--out)
OUT_FILE="$2"
shift
shift
;;
--debug)
FFMPEG="echo -e \nffmpeg"
SEP="\n"
shift
;;
*)
ARGS+=("$1")
shift
;;
esac
done
OUT_FILE=${OUT_FILE:?"--out <file> is undefined"}
SCALE=${SCALE:?"--scale <width:height> is undefined"}
# shellcheck disable=SC2068
join_files ${ARGS[@]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment