Overlay 2.0 (#12)

This commit is contained in:
2026-03-01 02:36:51 -08:00
committed by GitHub
parent 45df3c466b
commit 44c7761c7c
397 changed files with 15139 additions and 7127 deletions

View File

@@ -11,30 +11,36 @@ Description:
Generates two browser-friendly files next to the input file:
- <name>.mp4 (H.264 + AAC, prefers NVIDIA GPU if available)
- <name>.webm (AV1/VP9 + Opus, prefers NVIDIA GPU if available)
- <name>.gif (palette-optimised, 15 fps)
- <name>-poster.jpg (single frame for video poster fallback)
- <name>.webp (animated, only when --webp is provided)
Options:
-f, --force Overwrite existing output files
-w, --webp Generate animated WebP preview
Encoding profile:
- Crop: 1920x1080 at x=760 y=180
- Crop: 1920x1080 at x=760 y=200
- MP4: H.264 + AAC
- WebM: AV1/VP9 + Opus at 30 fps
USAGE
}
force=0
generate_webp=0
input=""
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
-h | --help)
usage
exit 0
;;
-f|--force)
-f | --force)
force=1
;;
-w | --webp)
generate_webp=1
;;
-*)
echo "Error: unknown option: $1" >&2
usage
@@ -73,7 +79,8 @@ base="${filename%.*}"
mp4_out="$dir/$base.mp4"
webm_out="$dir/$base.webm"
gif_out="$dir/$base.gif"
webp_out="$dir/$base.webp"
poster_out="$dir/$base-poster.jpg"
overwrite_flag="-n"
if [[ "$force" -eq 1 ]]; then
@@ -81,7 +88,11 @@ if [[ "$force" -eq 1 ]]; then
fi
if [[ "$force" -eq 0 ]]; then
for output in "$mp4_out" "$webm_out" "$gif_out"; do
outputs=("$mp4_out" "$webm_out" "$poster_out")
if [[ "$generate_webp" -eq 1 ]]; then
outputs+=("$webp_out")
fi
for output in "${outputs[@]}"; do
if [[ -e "$output" ]]; then
echo "Error: output exists: $output (use --force to overwrite)" >&2
exit 1
@@ -94,9 +105,8 @@ has_encoder() {
ffmpeg -hide_banner -encoders 2> /dev/null | grep -qE "[[:space:]]${encoder}[[:space:]]"
}
crop_vf="crop=1920:1080:760:180"
crop_vf="crop=1920:1080:760:205"
webm_vf="${crop_vf},fps=30"
gif_vf="${crop_vf},fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3"
echo "Generating MP4: $mp4_out"
if has_encoder "h264_nvenc"; then
@@ -157,12 +167,32 @@ else
"$webm_out"
fi
echo "Generating GIF: $gif_out"
ffmpeg "$overwrite_flag" -i "$input" \
-vf "$gif_vf" \
"$gif_out"
if [[ "$generate_webp" -eq 1 ]]; then
if ! has_encoder "libwebp"; then
echo "Error: encoder not found: libwebp" >&2
exit 1
fi
echo "Generating animated WebP: $webp_out"
ffmpeg "$overwrite_flag" -i "$input" \
-vf "${crop_vf},fps=24,scale=960:-1:flags=lanczos" \
-c:v libwebp \
-q:v 80 \
-loop 0 \
-an \
"$webp_out"
fi
echo "Generating poster: $poster_out"
ffmpeg "$overwrite_flag" -ss 00:00:05 -i "$input" \
-vf "$crop_vf" \
-vframes 1 \
-q:v 2 \
"$poster_out"
echo "Done."
echo "MP4: $mp4_out"
echo "WebM: $webm_out"
echo "GIF: $gif_out"
if [[ "$generate_webp" -eq 1 ]]; then
echo "WebP: $webp_out"
fi
echo "Poster: $poster_out"