173 lines
5.9 KiB
Bash
Executable File
173 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# ===================================================================
|
||
# GIT Converter — FINAL — 1080p FORCED + 60 FPS FIXED
|
||
# Author: LeakTechnologies
|
||
# ===================================================================
|
||
|
||
OUT="Converted"
|
||
mkdir -p "$OUT"
|
||
|
||
# Choose best available encoder with runtime check
|
||
pick_encoder() {
|
||
# candidate list in order of preference
|
||
local candidates=("$@")
|
||
for enc in "${candidates[@]}"; do
|
||
# Quick runtime probe: attempt tiny encode and discard output
|
||
if ffmpeg -hide_banner -loglevel error \
|
||
-f lavfi -i color=size=16x16:rate=1 -frames:v 1 \
|
||
-c:v "$enc" -f null - >/dev/null 2>&1; then
|
||
echo "$enc"
|
||
return 0
|
||
fi
|
||
done
|
||
return 1
|
||
}
|
||
|
||
clear
|
||
cat << "EOF"
|
||
|
||
╔═══════════════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ GIT Converter (December 2025) ║
|
||
║ by LeakTechnologies ║
|
||
║ ║
|
||
╚═══════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
EOF
|
||
|
||
# — Resolution —
|
||
echo " Choose your resolution:"
|
||
echo
|
||
echo " 1) Source file resolution (no upscale)"
|
||
echo " 2) 720p (1280×720)"
|
||
echo " 3) 1080p (1920×1080)"
|
||
echo " 4) 1440p (2560×1440)"
|
||
echo " 5) 4K (3840×2160)"
|
||
echo " 6) 2X Upscale"
|
||
echo " 7) 4X Upscale"
|
||
echo
|
||
read -p " Enter 1–7 → " res
|
||
|
||
case $res in
|
||
1) scale="" ; res_name="Source" ;;
|
||
2) scale="1280:720" ; res_name="720p" ;;
|
||
3) scale="1920:1080" ; res_name="1080p" ;;
|
||
4) scale="2560:1440" ; res_name="1440p" ;;
|
||
5) scale="3840:2160" ; res_name="4K" ;;
|
||
6) scale="iw*2:ih*2" ; res_name="2X" ;;
|
||
7) scale="iw*4:ih*4" ; res_name="4X" ;;
|
||
*) echo "Invalid — using 1080p"; scale="1920:1080"; res_name="1080p" ;;
|
||
esac
|
||
|
||
# — Codec + FPS + Container —
|
||
clear
|
||
cat << "EOF"
|
||
╔═══════════════════════════════════════════════════════════════╗
|
||
║ Choose codec + FPS ║
|
||
╚═══════════════════════════════════════════════════════════════╝
|
||
|
||
1) [MKV] AV1_AMF — Original FPS
|
||
2) [MKV] HEVC — Original FPS
|
||
3) [MKV] AV1_AMF — 60 FPS
|
||
4) [MKV] HEVC — 60 FPS
|
||
5) [MP4] HEVC — Original FPS
|
||
6) [MP4] HEVC — 60 FPS
|
||
EOF
|
||
echo
|
||
read -p " Enter 1–6 → " c
|
||
|
||
case $c in
|
||
1|3) codec_pref=("av1_amf" "libaom-av1") ;;
|
||
2|4|5|6) codec_pref=("hevc_amf" "hevc_nvenc" "h264_nvenc" "libx265") ;;
|
||
*) echo "Invalid — exiting"; sleep 3; exit ;;
|
||
esac
|
||
|
||
case $c in
|
||
1|2|3|4) ext="mkv" ;;
|
||
5|6) ext="mp4" ;;
|
||
esac
|
||
|
||
case $c in
|
||
3|4|6) fps_filter=",fps=60"; suf="_60fps" ;;
|
||
*) fps_filter=""; suf="" ;;
|
||
esac
|
||
|
||
# Resolve encoder now, once
|
||
codec=$(pick_encoder "${codec_pref[@]}")
|
||
if [ -z "$codec" ]; then
|
||
echo "No supported encoder found (tried: ${codec_pref[*]})."
|
||
echo "Install/enable GPU drivers or fall back to CPU codecs."
|
||
echo "Defaulting to libx265."
|
||
codec="libx265"
|
||
fi
|
||
|
||
# — Bitrate Selection —
|
||
clear
|
||
cat << "EOF"
|
||
╔═══════════════════════════════════════════════════════════════╗
|
||
║ Choose bitrate ║
|
||
╚═══════════════════════════════════════════════════════════════╝
|
||
|
||
1) 1800 kbps
|
||
2) 2000 kbps
|
||
3) 2300 kbps
|
||
4) 2600 kbps
|
||
5) 2900 kbps
|
||
6) 3200 kbps
|
||
7) 3500 kbps
|
||
8) 3800 kbps
|
||
9) Source file bitrate
|
||
EOF
|
||
echo
|
||
read -p " Enter 1–9 → " b
|
||
|
||
case $b in
|
||
1) BITRATE="1800k" ;;
|
||
2) BITRATE="2000k" ;;
|
||
3) BITRATE="2300k" ;;
|
||
4) BITRATE="2600k" ;;
|
||
5) BITRATE="2900k" ;;
|
||
6) BITRATE="3200k" ;;
|
||
7) BITRATE="3500k" ;;
|
||
8) BITRATE="3800k" ;;
|
||
9) BITRATE="source" ;;
|
||
*) BITRATE="2400k"; echo "Invalid → using default 2400k" ;;
|
||
esac
|
||
|
||
# Force 8-bit input
|
||
bitdepth_filter="-pix_fmt yuv420p"
|
||
|
||
echo
|
||
echo "Encoding → $codec | $res_name | $ext $suf @ ${BITRATE:-source} kbps"
|
||
echo
|
||
|
||
for f in *.mp4 *.mkv *.mov *.avi *.wmv *.ts *.m2ts; do
|
||
[[ -f "$f" ]] || continue
|
||
|
||
out="$OUT/${f%.*}${suf}__cv.$ext"
|
||
[[ -f "$out" ]] && { echo "SKIP $f"; continue; }
|
||
|
||
# Source bitrate if chosen
|
||
if [ "$BITRATE" = "source" ]; then
|
||
src_bitrate=$(ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 "$f" 2>/dev/null || echo 2400000)
|
||
this_bitrate=$(( src_bitrate / 1000 ))k
|
||
else
|
||
this_bitrate="$BITRATE"
|
||
fi
|
||
|
||
# FINAL FIXED CONVERSION — 1080p FORCED + 60fps works
|
||
if ffmpeg -y -i "$f" $bitdepth_filter -vf "scale=${scale}:flags=lanczos${fps_filter}" \
|
||
-c:v "$codec" -b:v "$this_bitrate" -c:a aac -b:a 192k -ac 2 "$out"; then
|
||
echo "DONE → $(basename "$out")"
|
||
else
|
||
echo "FAILED → $f (encoder: $codec). Check ffmpeg output above."
|
||
rm -f "$out"
|
||
fi
|
||
echo
|
||
done
|
||
|
||
echo "========================================================"
|
||
echo "All finished — files in '$OUT'"
|
||
echo "========================================================"
|
||
read -p "Press Enter to exit"
|