gtc-media-compress/gtc-media-compress.sh

131 lines
5.8 KiB
Bash
Raw Normal View History

2022-07-20 20:04:00 +02:00
#!/bin/bash
. /etc/bash/gaboshlib.include
g_nice
[ -z "$@" ] && g_yesno '!!! WARNUNG !!!
Dieses Progamm sucht Mediendateien (Videos, Audios und Bilder) und konvertiert sie mit dem Ziel diese deutlich platzsparender speichern zu können.
Die Qualität kann, muss aber nicht spürbar schlechter werden.
Folgende Dinge werden getan:
Videos
======
- Auflösung wird auf wahlweise maximal HD 720p oder DVD 480p skaliert. Bei niedrigeren Auflösungen wird nicht skaliert.
- Maximale Bitrate von 3600k an Auflösung bzw. Bitrate des Originalvideos orientiert.
- Videocodec HEVC (h265).
- Audiocodec in Videos AC3@384k (bei 5.1 oder mehr) und HeAACv2@48k (Stereo) bei untrer 5.1. sowie bei Mono Audiospuren wird HeAAC@24k verwendet.
- Als Containerformat für Video-Dateien wird MP4 genutzt.
- Untertitel falls nicht notwendig (forced) werden gelöscht. Nötige Untertitel werden ins Bild eingefügt.
Audios
======
- Als Containerformat für Audio-Dateien wird MP4 genutzt.
- Als Codec wird HeAAC bzw HeAACv2 (für Stereo) genutzt.
- Mehrfache Audiospuren (z.B. verschiedene Sprachen in Videos werden gelöscht). Nur eine Audiospur bzw. Deutsch falls vorhanden wird beibehalten.
- Mehr Kanäle wie zwei (z.B. 5.1) werden auf Stereo reduziert.
- Tags (auch eingebettete Bilder,...) sofern vorhanden werden bis auf Title, Artist, Album, Date, Tracknum und Genre entfernt.
- Aus bleibenden Tags werden Spezialzeichen ersetzt und bei kyrillischen Tags wird eine Transliteration in lateinische Zeichen hinzugefügt.
Bilder
======
- Als Bildformat wir JPEG verwendet. Alle nicht JPEG-Bilder werden zu JPEG konvertiert.
- Bilder werden zu 85% komprimiert.
- Bilder werden auf maximal 1080p herunterskaliert.
- Bilder werden "normalisiert" (Farbausgleich) um ggf. die Qualität sogar zu verbessern.
- In den Metadaten (EXIF) wird ein Kommentar hinzugefügt um bearbeitete Bilder zu markieren, damit sie nicht erneut bearbeitet werden.
Nicht bash-konformene Zeichen wie z.B. |, (,... werden aus Dateinamen entfernt.
Es sollte mit Kopien z.B. in einem Testordner vorab die Qualität geprüft werden.
Während die Verarbeitung läuft wird die CPU und ggf. auch GPU stark in Anspruch genommen, was zu erhöhtem Stromverbrauch und Hitzeentwicklung führt.
Bitte nicht z.B. bei Laptops auf Akku laufen lassen und darauf auchten, dass Lüfter nicht blockiert oder Lüftungsschlitze nicht verdeckt sind.
Bei längerer Nutzung auch die Stromrechnung im Blick behalten.
Die Priorität des Prozesses wird auf die niedrigste Stufe gesetzt, so dass "normale" Arbeit auf dem Gerät weiterhin möglich sein sollte.
Soll wirklich fortgefahren werden?
'
[ -z $DISPLAY ] || vidres=$(zenity --width=300 --height=300 --list --title="Videoauflösung" --text="Auf welche Videoauflösung soll maximal skaliert werden?" --column="Auflösung" "HD 720p" "DVD 480p")
if [ -z "$vidres" ]
then
#g_echo "Keine maximale Videoauflösung angegeben. - gehe von HD 720p aus"
vidres="HD 720p"
fi
if [ -z "$@" ]
then
mediapath=$(g_select-path "Suchpfad für Mediendateien angeben")
else
mediapath="$@"
[ -d "$mediapath" ] || [ -e "$mediapath" ] || g_echo_error_exit "$mediapath ist weder ein Pfad noch eine Datei"
fi
[ -f /etc/gtc/share/rename-subs/nospecial ] && gtc-rename -r /etc/gtc/share/rename-subs/nospecial -p "$mediapath"
[ -f /root/rename-subs/nospecial ] && gtc-rename -r /root/rename-subs/nospecial -p "$mediapath"
g_echo "Searching for Images in $mediapath"
g_find_image "$mediapath" | while read image
do
g_compress_image $image
done
g_echo "Searching for Audios in $mediapath"
g_find_audio "$mediapath" | while read audio
do
g_compress_audio $audio
done
g_echo "Searching for Videos in $mediapath"
find /tmp -name "*.g_progressing" -type f -user $(whoami) -delete >/dev/null 2>&1
cputhreads=$(cat /proc/cpuinfo | grep processor | wc -l)
ffmpegparallel=$(echo "$cputhreads/3" | bc -l | xargs printf %.0f)
if [ $ffmpegparallel -gt 1 ]
then
g_trap_exit="$g_trap_exit ; tmux kill-session -t g_ffmpegparallel >/dev/null 2>&1"
trap "$g_trap_exit" EXIT
echo $vidres | grep -q "480p" && dvdres="echo \$\$ >\"\$g_tmp\"/VID-SD"
g_find_video "$mediapath" >~/.g_tmpvidlist
vidnum=$(cat ~/.g_tmpvidlist | wc -l)
[ $ffmpegparallel -gt $vidnum ] && ffmpegparallel=$vidnum
g_echo "Doing $ffmpegparallel parallel encodings"
seq $ffmpegparallel | while read num
do
if [ $num -eq 1 ]
then
if echo $vidres | grep -q "480p"
then
echo -n 'tmux new -s g_ffmpegparallel ". /etc/bash/gaboshlib.include; echo \$\$ >"\$g_tmp"/VID-SD; cat ~/.g_tmpvidlist | sort -R | while read video; do g_compress_video \$video; done" ' >$g_tmp/g_vidcmd
echo -n '\; split-window -d ". /etc/bash/gaboshlib.include; echo \$\$ >"\$g_tmp"/VID-SD; cat ~/.g_tmpvidlist | sort -R | while read video; do g_compress_video \$video; done" \; select-layout even-vertical ' >>$g_tmp/g_vidcmd
else
echo -n 'tmux new -s g_ffmpegparallel ". /etc/bash/gaboshlib.include; cat ~/.g_tmpvidlist | sort -R | while read video; do g_compress_video \$video; done" ' >$g_tmp/g_vidcmd
fi
else
if echo $vidres | grep -q "480p"
then
echo -n "\; split-window -d \" sleep $num ; " >>$g_tmp/g_vidcmd
echo -n '. /etc/bash/gaboshlib.include; echo \$\$ >"\$g_tmp"/VID-SD; cat ~/.g_tmpvidlist | sort -R | while read video; do g_compress_video \$video; done" \; select-layout even-vertical ' >>$g_tmp/g_vidcmd
else
echo -n "\; split-window -d \" sleep $num ; " >>$g_tmp/g_vidcmd
echo -n '. /etc/bash/gaboshlib.include; cat ~/.g_tmpvidlist | sort -R | while read video; do g_compress_video \$video; done" \; select-layout even-vertical ' >>$g_tmp/g_vidcmd
fi
fi
done
tmux kill-session -t g_ffmpegparallel >/dev/null 2>&1
rm -f /tmp/*.g_progressing
if [ -f $g_tmp/g_vidcmd ]
then
cat $g_tmp/g_vidcmd
. $g_tmp/g_vidcmd
fi
rm ~/.g_tmpvidlist
else
echo $vidres | grep -q "480p" && echo $$ >"$g_tmp"/VID-SD
g_find_video "$mediapath" | while read video
do
g_compress_video $video
done
fi