h.265 Umstellung (Version, Beta-0.9.5-8 (20240925,2105))

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.