Ich stelle Videos auf h.265 um. Dazu habe ich mit meinem Bruder mir eine kleine Hilfe gebaut.
(Ich nutze dazu Debian 12 mit dem HEVC encoder version 3.5 und ffmpeg version 6.0.1)
#!/bin/bash # Einfache h.265 Umstellungshilfe. # Author: Eiskalter Winter# Version, Beta-0.9.5-8 (20240925,2105) # Die Verzeichnisse müssen für das eigene System angepasst werden. # DIRA ist das Verzeichnis der Quelldateien. # DIRB ist das Verzeichnis für die temporären Dateien vom first Pass und für die umgestellte Datei bis sie fertig ist. Danach wird die fertige Datei ins Verzeichnis DIRD verschoben. # DIRC ist das Verzeichnis wo die Quelldateien hin verschoben werden wenn die Dateien umgestellt wurden. # DIRD ist das Verzeichnis wo die fertigen Dateien hin verschoben werden. # DIRE ist das Verzeichnis wo die die input.txt liegt. DIRA=~/Bearbeitung/Videos/1-Umstellung DIRB=~/Bearbeitung/Videos/2-Bearbeitung DIRC=~/Bearbeitung/Videos/3-Umgestellt DIRD=~/Bearbeitung/Videos/4-Fertig DIRE=~/Bearbeitung/Videos # Input Datei. Variablen werden durch diese Datei übergeben. input="$DIRE/input.txt" # Hardwarebeschleunigung. !!!!! Nicht getestet !!!!! # Muss für eigenes System angepasste sein. #hwaccel="-hwaccel cuvid" #CUDA Video Decoding API (Nvidia) #hwaccel="-hwaccel vdpau" #Video Decode and Presentation API for Unix (Nvidia, ATI, S3, ...) #hwaccel="-hwaccel vaapi" #Video Acceleration API (Nvidia, ATI, Intel, S3, ...) hwaccel="" #keine # Kopieren oder umstellen? videncod=`cat $input | grep "=" | grep videncoder | cut -d "=" -f 2` if [ "$videncod" == "copy" ]; then encoder="-c:v copy" else if [ "$videncod" == "h265" ]; then encoder="-c:v copy -c:v:0 libx265" else echo -e "\e[5;93mKein Encoder für den Videostream angegeben.\033[00m" exit 1 fi fi # ffmpeg einstellungen erw0="-fix_sub_duration -analyzeduration 1000G -probesize 1000G" erw1="-coder 1 -refs 4 -deblock 1:0:0 -partitions +partp4x4 -psy 1 -psy-rd 1.00:0.00 -psymodel -1 -cmp rd -nr 0 -rc-lookahead 100 -direct-pred spatial -flags +loop -me_method hex -subq 7 -me_range 16 -trellis 1 -chromaoffset -2 -bf 3 -b_strategy 2 -g 100 -keyint_min 10 -sc_threshold 0 -qcomp 0.60 -qmin 0 -qmax 69 -qdiff 4 -i_qfactor 1.40" #erw1="" erw2="-8x8dct 1 -b-pyramid 2 -mixed-refs 1 -refs 4 -weightp 1" #erw2="" # CPU-Einstellungen cpu1="-cpuflags +mmx+mmxext+sse+sse2+sse3+ssse3+sse4.1+sse4.2+avx+avx2+fma3+bmi1+bmi2+cmov -threads 20" #Xeon E5-2630L v4, i9 10700k, … #cpu1="-cpuflags +cmov+sse4.2 -threads 4" # h265 encoding einstellungen crf=`cat $input | grep "=" | grep crf | cut -d "=" -f 2` erw265="input-depth=12:no-sao=1:level=5.2:aq-mode=3:crf=$crf:high-tier=1:level-idc=52:output-depth=12:keyint=1:lossless=1" cd $DIRA # Überprüfung ob ffmpeg schon läuft. APPLICATIONS="ffmpeg" IsRunning() { for i in $*; do if [ `pgrep -c $i` -gt 0 ] ; then return 1 fi done return 0 } IsRunning $APPLICATIONS if [ "$?" == "1" ]; then echo -e "\e[5;93mEine Instanz von ffmpeg läuft schon.\033[00m" echo -e "\e[5;93mBearbeitung wurde gestoppt.\033[00m" exit 1 else clear fi # Profile für die Umstellung: # 8bit profiles: # mmain, main-intra, mainstillpicture # main444-8, main444-intra, main444-stillpicture # 10bit profiles: # main10, main10-intra # main422-10, main422-10-intra # main444-10, main444-10-intra # 12bit profiles: # main12, main12-intra # main422-12, main422-12-intra # main444-12, main444-12-intra profile=main444-12-intra # Presents für die Umstellung (1 Pass): preset1=`cat $input | grep "=" | grep present1 | cut -d "=" -f 2` # Presents für die Umstellung (2 Pass): preset2=`cat $input | grep "=" | grep present2 | cut -d "=" -f 2` # Durchschnittliche Videobitrate # 1 = 1k | 1000 = 1000k avbit=`cat $input | grep "=" | grep avbit | cut -d "=" -f 2` if [[ "$avbit" == "j" || "$avbit" == "y" ]]; then echo "" elif [ "$avbit" == "n" ]; then bit=`cat $input | grep "=" | grep videobit | cut -d "=" -f 2` kbit="$bit"k else exit 1 fi # Minimale Videobitrate min=0 # Maximale Videobitrate # Das wie viel fache der durchschnittlichen Videobitrate? maxmal=`cat $input | grep "=" | grep maxmal | cut -d "=" -f 2` if [[ "$avbit" == "j" || "$avbit" == "y" ]]; then echo "" elif [ "$avbit" == "n" ]; then max=`expr $bit \* $maxmal` kmax="$max"k else exit 1 fi # Framerate des fertiggestellten Videos. fps=`cat $input | grep "=" | grep fps | cut -d "=" -f 2` if [ "$fps" == "" ]; then exit 2 elif [ "$fps" == "0" ]; then fps1="" else fps1="-r $fps" fi # Untertitel? sub1=`cat $input | grep "=" | grep sub1 | cut -d "=" -f 2` if [ "$sub1" == "0" ]; then sub="-sn" sub2="none" elif [ "$sub1" == "1" ]; then sub="-sub_charenc UTF-8 -c:s copy" sub2="copy" else exit 3 fi #--- Audio --- # Audiospur auds1=`cat $input | grep "=" | grep auds1 | cut -d "=" -f 2` auds2=`cat $input | grep "=" | grep auds2 | cut -d "=" -f 2` auds3=`cat $input | grep "=" | grep auds3 | cut -d "=" -f 2` auds4=`cat $input | grep "=" | grep auds4 | cut -d "=" -f 2` # Audiosprache language1=`cat $input | grep "=" | grep language1 | cut -d "=" -f 2` language2=`cat $input | grep "=" | grep language2 | cut -d "=" -f 2` language3=`cat $input | grep "=" | grep language3 | cut -d "=" -f 2` language4=`cat $input | grep "=" | grep language4 | cut -d "=" -f 2` lnga="-metadata:s:a:0 language=$language1 -metadata:s:a:0 title= -metadata:s:a:1 language=$language2 -metadata:s:a:1 title= -metadata:s:a:2 language=$language3 -metadata:s:a:2 title= -metadata:s:a:3 language=$language4 -metadata:s:a:3 title=" disp="-disposition:a:1 none -disposition:a:2 none -disposition:a:3 none -disposition:a:0 default" # Encoder für die Audioumstellung: aac, libfdk_aac, ac3, copy, flac, mp2, libmp3lame, vorbis, wmav2, … audencoder=`cat $input | grep "=" | grep audencoder | cut -d "=" -f 2` audiobit=`cat $input | grep "=" | grep audiobit | cut -d "=" -f 2` audiobitk="$audiobit"k if [ "$audencoder" == "copy" ]; then aencoder="-c:a copy" else aencoder="-c:a $audencoder -b:a $audiobitk" fi # Wie viele Audiospuren? (Maximal vier Audiospuren.) tracks=`cat $input | grep "=" | grep tracks | cut -d "=" -f 2` if [ "$tracks" == "0" ]; then if [ "$sub1" == "0" ]; then audiomap="-map 0:v" audiomap1="nein" elif [ "$sub1" == "1" ]; then audiomap="-map 0:v -map 0:s" audiomap1="ja" fi elif [ "$tracks" == "1" ]; then if [ "$sub1" == "0" ]; then audiomap="-map 0:v -map 0:$auds1" audiomap1="nein" elif [ "$sub1" == "1" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:s" audiomap1="ja" fi elif [ "$tracks" == "2" ]; then if [ "$sub1" == "0" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2" audiomap1="nein" elif [ "$sub1" == "1" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2 -map 0:s" audiomap1="nein" fi elif [ "$tracks" == "3" ]; then if [ "$sub1" == "0" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2 -map 0:$auds3" audiomap1="nein" elif [ "$sub1" == "1" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2 -map 0:$auds3 -map 0:s" audiomap1="nein" fi elif [ "$tracks" == "4" ]; then if [ "$sub1" == "0" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2 -map 0:$auds3 -map 0:$auds4" audiomap1="nein" elif [ "$sub1" == "1" ]; then audiomap="-map 0:v -map 0:$auds1 -map 0:$auds2 -map 0:$auds3 -map 0:$auds4 -map 0:s" audiomap1="nein" fi else exit 4 fi #--- Video Sonstiges --- # Ränder entfernen? corp0=`cat $input | grep "=" | grep corp0 | cut -d "=" -f 2` if [ "$corp0" == "0" ]; then corp1="" elif [ "$corp0" == "1" ]; then corpa=`cat $input | grep "=" | grep corpa | cut -d "=" -f 2` corpb=`cat $input | grep "=" | grep corpb | cut -d "=" -f 2` corpx=`cat $input | grep "=" | grep corpx | cut -d "=" -f 2` corpy=`cat $input | grep "=" | grep corpy | cut -d "=" -f 2` corp1=crop else exit 5 fi # Logo entfernen? logo0=`cat $input | grep "=" | grep logo0 | cut -d "=" -f 2` if [ "$logo0" == "0" ]; then logo1="" elif [ "$logo0" == "1" ]; then logox=`cat $input | grep "=" | grep logox | cut -d "=" -f 2` logoy=`cat $input | grep "=" | grep logoy | cut -d "=" -f 2` logow=`cat $input | grep "=" | grep logow | cut -d "=" -f 2` logoh=`cat $input | grep "=" | grep logoh | cut -d "=" -f 2` logo1=delogo else exit 6 fi # Schneiden, Angabe vom Dateianfang aus gesehen ssbof=`cat $input | grep "=" | grep ssbof | cut -d "=" -f 2` if [[ "$ssbof" == "" || "$ssbof" == "n" ]]; then ssbof1="" else ssbof1="-ss $ssbof -accurate_seek" fi # Schneiden, Angabe vom Dateiende aus gesehen sseof=`cat $input | grep "=" | grep sseof | cut -d "=" -f 2` if [[ "$sseof" == "" || "$sseof" == "n" ]]; then sseof1="" else if [[ "$ssbof" == "" || "$ssbof" == "n" ]]; then sseof1="-sseof $sseof -accurate_seek" else sseof1="" fi fi if [ "$ssbof1" == "" ]; then if [ "$sseof1" == "" ]; then ssof="" else ssof="$sseof1" fi else ssof="$ssbof1" fi # Schwarze Balken entfernen und delogo if [[ "$corp0" == "0" && "$logo0" == "0" ]]; then ext1="" ext2="" elif [[ "$corp0" == "1" && "$logo0" == "0" ]]; then ext1="-filter:v:0 $corp1=$corpa:$corpb:$corpx:$corpy" ext2="-filter:v:0 $corp1=$corpa:$corpb:$corpx:$corpy" corp2="$corp1=$corpa:$corpb:$corpx:$corpy" elif [[ "$corp0" == "0" && "$logo0" == "1" ]]; then ext1="" ext2="-filter:v:0 $logo1=x=$logox:y=$logoy:w=$logow:h=$logoh:show=0" logo2="$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh" elif [[ "$corp0" == "1" && "$logo0" == "1" ]]; then ext1="-filter:v:0 $corp1=$corpa:$corpb:$corpx:$corpy" ext2="-filter:v:0 $corp1=$corpa:$corpb:$corpx:$corpy,$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh:show=0" corp2="$corp1=$corpa:$corpb:$corpx:$corpy" logo2="$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh" fi # Zeitweises delogo wird hinten angefügt fbeon=`cat $input | grep "=" | grep fbeon | cut -d "=" -f 2` fbet0=`cat $input | grep "=" | grep fbet0 | cut -d "=" -f 2` fbet1=`cat $input | grep "=" | grep fbet1 | cut -d "=" -f 2` if [ "$fbeon" == "1" ]; then fbet2="enable='between(t,$fbet0,$fbet1)'" elif [ "$fbeon" == "0" ]; then fbet2="" else fbet2="" fi if [[ "$fbeon" == "" || "$fbeon" == "n" || "$fbeon" == "0" ]]; then ext3=$ext2 else if [[ "$fbeon" == "1" && "$logo0" == "1" ]]; then ext3=$ext2:$fbet2 else ext3=$ext2 fi fi #--- Muxing --- format=`cat $input | grep "=" | grep format | cut -d "=" -f 2` if [ "$format" == "matroska" ]; then endung=mkv elif [ "$format" == "mp4" ]; then endung=mp4 elif [ "$format" == "webm" ]; then endung=webm elif [ "$format" == "matroska.webm" ]; then endung=matroska.webm else exit 7 fi # Überprüfung if [ "$profile" == "" ]; then exit 8 elif [ "$preset1" == "" ]; then exit 9 elif [ "$preset2" == "" ]; then exit 10 elif [ "$audencoder" == "" ]; then exit 11 elif [ "$sub" == "" ]; then exit 12 elif [ "$format" == "" ]; then exit 13 elif [ "$tracks" == "" ]; then exit 14 fi if [[ "$avbit" == "j" || "$avbit" == "y" ]]; then echo "" elif [ "$kbit" == "" ]; then exit 15 elif [ "$kmax" == "" ]; then exit 16 fi # Soll fortgefahren werden? ok=`cat $input | grep "=" | grep ok | cut -d "=" -f 2` if [[ "$ok" == "j" || "$ok" == "y" ]]; then echo "" elif [ "$ok" == "n" ]; then exit 17 else exit 18 fi # Eigentliche Umstellung der Dateien for file in *{.avi,.divx,.flv,.m2t,.mkv,.mp4,.mpg,.pva,.ts,.vob,.webm,.wmv} ; do FILENAME=$(basename "$file") NAME=`echo "${FILENAME%.*}"` file1=`echo $file | grep -v "^*"` SIZE=`ls -l "$file" | cut -d " " -f5` DATE=`date '+%Y-%m-%d %H:%M:%S'` ENCODER=`ffmpeg -version | grep -n ffmpeg | grep 1: | cut -d : -f 2 | cut -d " " -f 1-3` if [[ "$avbit" == "j" || "$avbit" == "y" ]]; then # Berechnung der durchschnittlichen und maximalen Videobitrate brate=`/usr/bin/mediainfo --Inform="Video;%BitRate%" "$DIRA"/"$file1"` # Bei automatischer Bitrate, wieviel Prozent weniger probit=`cat $input | grep "=" | grep probit | cut -d "=" -f 2` rbit=`expr $brate / 1000` rbit1=`expr $rbit \* $probit` rbit2=`expr $rbit1 / 1000` bit=`expr $rbit - $rbit2` max=`expr $bit \* $maxmal` kbit="$bit"k kmax="$max"k elif [ "$avbit" == "n" ]; then echo "" else exit 1 fi ##1 Pass pv -pteracb -s $SIZE "$DIRA"/"$file1" | /usr/bin/ffmpeg $cpu1 $hwaccel -y $ssbof1 $sseof1 $erw0 -i pipe:0 -max_muxing_queue_size 99999 -dn $ext1 $audiomap -preset $preset1 $encoder -x265-params "profile=$profile:$erw265" $erw1 -b:v $kbit -minrate $min -maxrate $kmax -bufsize 256M $fps1 -x265-params pass=1:stats="$DIRB"/"$NAME".log -an -sn -f $format $erw2 /dev/null ##2 Pass pv -pteracb -s $SIZE "$DIRA"/"$file1" | /usr/bin/ffmpeg $cpu1 $hwaccel -y $ssbof1 $sseof1 $erw0 -i pipe:0 -max_muxing_queue_size 99999 $ext3 $audiomap $disp -preset $preset2 $encoder -x265-params "profile=$profile:$erw265" $erw1 -b:v $kbit -minrate $min -maxrate $kmax -bufsize 256M $fps1 -x265-params pass=2:stats="$DIRB"/"$NAME".log $aencoder -vbr 3 -map_chapters 0 -map_metadata 0 -metadata:s:v language="" -metadata:s:v title="" $lnga -metadata title="$NAME" -metadata encoder="$ENCODER" -metadata bitrate="$kbit" -metadata creation_time="$DATE" $erw2 $sub -f $format "$DIRB"/"$NAME"-bearbeitung.$endung if [ $? -eq 0 ]; then if [ -f "$DIRA"/"$file" ] then rm "$DIRB"/"$NAME".log rm "$DIRB"/"$NAME".log.cutree mv "$DIRB"/"$NAME"-bearbeitung.$endung "$DIRD"/"$NAME"-fertig.$endung mv "$DIRA"/"$file" "$DIRC" fi else echo -e "\e[5;93mEs gab Probleme bei der Umstellung der Datei \e[25;36m'$NAME'\e[5;93m!!!\033[00m" fi done exit 0
———-
Dazu gehört noch eine zweit Datei, input.txt, in der die Optionen für die Umstellung angegeben werden. (Siehe „DIRE“ im Skript.)
# Presents für die Umstellung (1 Pass):
# ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
present1=veryfast
# Presents für die Umstellung (2 Pass):
# ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
present2=veryfast
# "h265" oder "copy" anwenden? Den Videostream umstellen oder kopieren?
videncoder=h265
# Automatische durchschnittliche Videobitrate?
# ( y/j = ja | n = nein )
avbit=n
# Bei automatischer Bitrate, wie viele Prozent weniger?
# ( 0,1% = 1 | 1% = 10 | 10% = 100 )
probit=0
# Durchschnittliche Videobitrate, manuelle Eingabe. Nur wenn automatische durchschnittliche Videobitrate auf "n" steht.
# ( 1 - 1k | 1000 - 1000k )
videobit=3500
# Maximale Videobitrate
# (Das wie Vielfache der durchschnittlichen Videobitrate?)
maxmal=6
# CRF, (Constant Rate Factor) Bereich der Quantisierungsskala
# 0 = beste Qualität, 51 = schlechteste Qualität (18 = mein Standard)
crf=18
# Framerate des fertiggestellten Videos.
# ('0' für FPS des Videos übernehmen.)
fps=0
# Wie viele Audiospuren? (Wichtig, nie mehr angeben als die Quelle hat!)
# (Maximal vier Audiospuren.)
tracks=1
# Welche Audiospur soll benutzt werden?
# (Und wie angeordnet?)
auds1=1
auds2=2
auds3=3
auds4=4
# Welcher Audiospur hat welche Audiosprache?
# (ISO 639-2 Language Code List)
language1=ger
language2=eng
language3=ger
language4=Kommentar
# Encoder für die Audioumstellung: aac, libfdk_aac, ac3, copy, flac, mp2, libmp3lame, vorbis, wmav2, ...
# Welche Encoder werden unterstützt: ffmpeg -encoders
audencoder=copy
# Bitrate für Audio.
# ( 1 - 1k | 1000 - 1000k )
audiobit=0
# Soll das Videos beschnitten werden? "##:##:##.###, hh:mm:ss.ms"
# Am Anfang des Videos
ssbof=n
# Angaben vom Ende des Videos aus gesehen
sseof=n
# Zeitweise Anwendung von delogo. Angabe in Sekunden. (logo0 muss auf 1 dafür stehen)
# ("1" = ja, "0" oder "n" = nein)
fbeon=0
# Von
fbet0=0
#Bis / Wie lange anwenden
fbet1=0
# Soll vom Video die Ränder entfernt werden (0 nein, 1 ja)?
corp0=0
#Breite des Videos?
corpa=0
#Höhe des Videos?
corpb=0
#Ab Breite?
corpx=0
#Ab Höhe?
corpy=0
# Soll ein Logo entfernt werden (0 nein, 1 ja)?
logo0=0
#Ab Breite?
logox=0
#Ab Höhe?
logoy=0
#Breite des Logos?
logow=0
#Höhe des Logos?
logoh=0
# 0 kein Untertitel, 1 Kopiere Untertitel (Wichtig, auf 0 stellen wenn keiner vorhanden!)
sub1=0
# Muxer: matroska, matroska.webm, mp4, webm
format=matroska
# Sind die Einstellungen richtig, soll fortgefahren werden ("n"=nein, "j/y"=ja)?
ok=y
———-
Leider ist das Changelog nicht ganz vollständig da eine Datei wo die Änderungen vermerk waren versehentlich gelöscht wurde.
(Version 1.0 wird erst erreicht wenn es auf HW-Coding einrichte und getestet wurde. Da aber keine entsprechende Graka vorhanden ist wird dies noch etwas dauern.)
Changelog (Wieder aufgenommen am 21.07.2024):
Beta-0.9.5-8 (20240925,2105):
Im Dateinamen können jetzt auch Punkte verwendet werden.
Beta-0.9.5-7 (20240731,2116):
Variable für den Video-Encoder über die input.txt eingefügt für „copy“ und „h265“.
Beta-0.9.5-6 (20240721,0740):
Variable für die Abfrage der CRF-Einstellung über die input.txt eingefügt.
Skript zur Überprüfung ob „ffmpeg“ schon läuft gelöscht da diese Abfrage auch im Umstellungsskript vorhanden ist.
Changelog: (Bis 18.01.2020)
beta-0.8.8 ffmpeg Einstellungen in eine Variable gesetzt. Änderung dass erst die fertig umgestellte Datei verschoben wird, danach erst die Quelldatei.
beta-0.8.7 Wenn kein Untertitel ausgewählt wurde wird er auch nicht mehr gemapt.
beta-0.8.6 time Befehl entfernt. (Läuft über vorgeschaltetes Skript.)
beta-0.8.5 max_muxing_queue_size 9999 in 2.Pass hinzugefügt.
beta-0.8.4 Fehlende “ hinzugefügt.
beta-0.8.3 Mit pv Statuszeile für 1.Pass & 2.Pass hinzugefügt.
beta-0.8.2 time Befehl angepasst, time vor „for file do …“ wieder entfernt.
beta-0.8.1 time vor „for file do …“ und vor 1.Pass & 2.Pass hinzugefügt.
beta-0.8.0 Einige Texte angepasst, Möglichkeiten des HW-Encoding hinzugefügt.
beta-0.7.5 Subtitle Bearbeitung in 1.Pass deaktiviert.
beta-0.7.4 Bei delogo falsche Textzuordnung verbessert, delogo nur noch im 2.Pass, auskommentierten Text verschoben.
beta-0.7.3 Schreibfehler behoben.
beta-0.7.2 delogo & corp variable geändert.
beta-0.7.1 hwaccel erweitert.
beta-0.7.0 delogo hinzugefügt.
beta-0.6.2 Teilweise auskommentierte Zeilen entfernt.
beta-0.6.1 Fehler in corp variable entfernt.
beta-0.6.0 Ränder entfernen (corp) hinzugefügt.
———-
Hinzu kommt noch ein Skript was das ganze startet. Es schaut nach wie viele Dateien im Verzeichnis für die Umstellung vorhanden sind. Sind keine vorhanden wird auch keine Umstellung gestartet. Und es wird nach der Umstellung angezeigt wie lange es gedauert hat.
#/bin/sh
COUNT=`ls ~/Bearbeitung/Videos/1-Umstellung/*{.avi,.divx,.flv,.m2t,.mkv,.mp4,.mpg,.pva,.ts,.vob,.webm,.wmv} 2> /dev/null | wc -l`
if [ "$COUNT" -ge "1" ]; then
export TIME="\tLaufzeit: %E | CPU: %P | Speicher: %K | HDD: %O R/%I W" 2> /dev/null
/usr/bin/time bash ~/bin/h265_umstellung.sh
else
# echo "Keine Datei im Verzeichnis."
exit
fi
exit
———-
Hier die Dateien zum Downloaden mit einem Skript zur Installation auf Debian 12.


