commit 578dbcf91e6d5e3044600b2bcfa5e6d533709868 Author: olli Date: Wed Jul 20 20:04:00 2022 +0200 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/gtc-media-compress.sh b/gtc-media-compress.sh new file mode 100755 index 0000000..b75d775 --- /dev/null +++ b/gtc-media-compress.sh @@ -0,0 +1,130 @@ +#!/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 +