h.265 Umstellung

Ich stelle zur Zeit einige meiner Videos auf h.265 um. Dazu habe ich mit meinem Bruder mir eine kleine Hilfe gebaut.

(Ich nutze HEVC encoder version 2.9 und ffmpeg version 3.4.5)

#!/bin/bash

# Einfache h.265 Umstellungshilfe.
# Author: Eiskalter Winter  <wwerrber@yahoo.com>
# Version, Beta-0.7.4 (20190711,0527)

#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 sie ins Verzeichnis DIRD verschoben.
#DIRC ist das Verzeichnis wo die Quelldateien hin verschoben werden wenn die Datei umgestellt wurde.
#DIRD ist das Verzeichnis wo die fertigen Dateien hin verschoben werden.

DIRA=/home/video/Umstellung
DIRB=/home/video/Bearbeitung
DIRC=/home/video/Umstellung/Umgestellt
DIRD=/home/video/Fertig

#Für einen kleine Entlastung der CPU kann man für das Decoden (nicht fürs Encoden) die GPU helfen. Vorausgesetzt entsprechende Unterstützung ist installiert.
#Das muss fürs eigene 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

#Wird am ende als Information das es fertig ist abgespielt (mp3/wav). Genutzt wird cvlc.
endsnd="/home/video/fertig.mp3"

cd $DIRA

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

  echo -e "\e[7;49;37m--- Unstellung auf H265 ---\e[00m"
  echo " "
  echo -e "\e[7;49;95m--- Video ---\e[00m"
#  echo -e "\033[32mProfile für die Umstellung:"
#  echo -e "\033[32m8bit profiles:"
#  echo -e "\033[32mmain, main-intra, mainstillpicture"
#  echo -e "\033[32mmain444-8, main444-intra, main444-stillpicture"
#  echo -e "\033[32m"
#  echo -e "\033[32m10bit profiles:"
#  echo -e "\033[32mmain10, main10-intra"
#  echo -e "\033[32mmain422-10, main422-10-intra"
#  echo -e "\033[32mmain444-10, main444-10-intra"
#  echo -e "\033[32m"
#  echo -e "\033[32m12bit profiles:"
#  echo -e "\033[32mmain12, main12-intra"
#  echo -e "\033[32mmain422-12, main422-12-intra"
#  echo -e "\033[32mmain444-12, main444-12-intra\033[00m"
#  read -p "Profile: " profile
profile=main444-12-intra
#  echo " "
  echo -e "\033[32mPresents für die Umstellung (1 Pass): ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo\033[00m"
  read -p "Preset: " preset1
  echo " "
  echo -e "\033[32mPresents für die Umstellung (2 Pass): ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo\033[00m"
  read -p "Preset: " preset2
  echo " "
  echo -e "\033[32mDurchnittliche Videobitrate"
  echo -e "( 1 = 1k | 1000 = 1000k )\033[00m"
  read -p "Bitrate: " bit
kbit="$bit"k
min=0
  echo " "
  echo -e "\033[32mMaximale Videobitrate"
  echo -e "Das wie viel fache der durchschnittlichen Videobitrate?\033[00m"
  read -p "Maximum: " maxmal
max=`expr $bit \* $maxmal`
kmax="$max"k
  echo " "
  echo -e "\033[32mFramerate des fertiggestellten Videos. ('0' für FPS des Videos übernehmen.)\033[00m"
  read -p "Framerate: " fps
  echo " "
  echo " "
  echo -e "\e[7;49;95m--- Audio ---\033[00m"
  echo -e "\033[32mSoll die Audiospur von Spur 0 auf Spur 1 und Spur 1 auf Spur 0 wechseln?"
  echo -e "(0=nein, 1=ja, 2=nein und nur eine Audiospur, 3=ja und nur eine Audiospur)\033[00m"
  read -p "Spur wechseln: " aud
  echo " "
  echo -e "\033[32mSoll die Audiosprache gewechselt werden? (0=nein, 1=ja)"
  echo -e "Standard ist erste Sprache Deutsch (ger), zweite Sprache Englisch (eng).\033[00m"
  read -p "Standard wechseln: " lang1

    if [ "$lang1" == "0" ]; then
      language1=ger
      language2=eng
      elif [ "$aud" == "2" ]; then
      echo " "
      echo -e "\033[32mSprache?\033[00m"
      read -p ": " language1
      elif [ "$aud" == "3" ]; then
      echo " "
      echo -e "\033[32mSprache?\033[00m"
      read -p ": " language1
      elif [ "$lang1" == "1" ]; then
      echo " "
      echo -e "\033[32mErste Sprache?\033[00m"
      read -p ": " language1
      echo -e "\033[32mZweite Sprache?\033[00m"
      read -p ": " language2
      else
      echo " "
      echo -e "\e[5;93mBearbeitung wurde gestoppt.\033[00m"
      exit 1
    fi

  echo " "
#  echo -e "\033[32mEncoder für die Audioumstellung: aac, libfdk_aac, ac3, copy, flac, mp2, libmp3lame, vorbis, wmav2, ..."
#  echo -e "Welche Encoder werden unterstützt: ffmpeg -encoders"
#  read -p "Encoder: " aencoder
aencoder=copy
#  echo " "
#  echo -e "\033[32mBitrate für Audio."
#  echo -e "(1000000 | 1000k | 1m)"
#  read -p "Bitrate: " bitaudio
bitaudio=0
#  echo " "
  echo " "
  echo -e "\e[7;49;95m--- Ränder ---\033[00m"
  echo -e "\033[32mSoll vom Video die Ränder entfernt werden? (0=nein, 1=ja)\033[00m"
  read -p "Ränder entfernen?: " corp0

    if [ "$corp0" == "0" ]; then
      corp1=""
      elif [ "$corp0" == "1" ]; then
      echo " "
      echo -e '\033[32m-vf "crop=a:b:x:y"\033[00m'
      echo -e "\033[32mbreite     a\033[00m"
      echo -e "\033[32mhöhe       b\033[00m"
      echo -e "\033[32mab breite  x\033[00m"
      echo -e "\033[32mab höhe    y\033[00m"
      echo " "
      echo -e "\033[32mBreite des Videos?\033[00m"
      read -p ": " corpa
      echo -e "\033[32mHöhe des Videos?\033[00m"
      read -p ": " corpb
      echo -e "\033[32mAb Breite?\033[00m"
      read -p ": " corpx
      echo -e "\033[32mAb Höhe?\033[00m"
      read -p ": " corpy
      corp1=crop
      else
      echo -e "\e[5;93mBearbeitung wurde gestoppt.\033[00m"
      exit 1
    fi

  echo " "
  echo " "
  echo -e "\e[7;49;95m--- Logo ---\033[00m"
  echo -e "\033[32mSoll ein Logo entfernt werden? (0=nein, 1=ja)\033[00m"
  read -p "Logo entfernen?: " logo0

    if [ "$logo0" == "0" ]; then
      logo1=""
      elif [ "$logo0" == "1" ]; then
      echo " "
      echo -e '\033[32m-vf "logo=x:y:w:h"\033[00m'
      echo -e "\033[32mab breite  x\033[00m"
      echo -e "\033[32mab höhe    y\033[00m"
      echo -e "\033[32mbreite     w\033[00m"
      echo -e "\033[32mhöhe       h\033[00m"
      echo " "
      echo -e "\033[32mAb Breite?\033[00m"
      read -p ": " logox
      echo -e "\033[32mAb Höhe?\033[00m"
      read -p ": " logoy
      echo -e "\033[32mBreite des Logos?\033[00m"
      read -p ": " logow
      echo -e "\033[32mHöhe des Logos?\033[00m"
      read -p ": " logoh
      logo1=delogo
      else
      echo -e "\e[5;93mBearbeitung wurde gestoppt.\033[00m"
      exit 1
    fi

  echo " "
  echo " "
  echo -e "\e[7;49;95m--- Untertitel ---\033[00m"
  echo -e "\033[32m0 = kein Untertitel, 1 = Kopiere Untertitel\033[00m"
  read -p "Untertitel: " sub1
  echo " "
  echo " "
  echo -e "\e[7;49;95m--- Muxing ---\033[00m"
  echo -e "\033[32mMuxer: matroska, matroska.webm, mp4, webm"
  echo -e "Welches Muxing wird unterstützt: ffmpeg -formats\033[00m"
  read -p "Format: " format

  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
    echo -e "\e[5;93mBearbeutung wurde gestoppt, falsche Eingabe des Muxers.\033[00m"
    exit 1
  fi

  if [ "$sub1" == "0" ]; then
    sub="-sn"
    sub2="none"
    elif [ "$sub1" == "1" ]; then
    sub="-c:s copy"
    sub2="copy (falls vorhanden)"
    else
    echo -e "\e[5;93mBearbeutung wurde gestoppt, falsche Eingabe bei Untertitel.\033[00m"
    exit 1
  fi

clear

  if [ "$endung" == "mkv" ]; then
    echo -e "\e[25;36mEs soll eine Matroska-Datei erstellt werden.\033[00m"
    echo " "
    echo " "
    elif [ "$endung" == "mp4" ]; then
    echo -e "\e[25;36mEs soll eine MP4-Datei erstellt werden.\033[00m"
    echo " "
    echo " "
    elif [ "$endung" == "webm" ]; then
    echo -e "\e[25;36mEs soll eine Webm-Datei erstellt werden.\033[00m"
    echo " "
    echo " "
    elif [ "$endung" == "matroska.webm" ]; then
    echo -e "\e[25;36mEs soll eine Matroska.Webm-Datei erstellt werden.\033[00m"
    echo " "
    echo " "
    else
    echo -e "\e[5;93mEs wurde kein Muxer eingegeben, oder falsch eingegeben.\nDaher wird hier gestoppt.\033[00m"
    echo " "
    echo " "
    exit 1
  fi

  if [ "$aud" == "0" ]; then
    audiomap="-map 0"
    audiomap1="nein"
    elif [ "$aud" == "1" ]; then
    audiomap="-map 0:0 -map 0:2 -map 0:1 -map 0:s"
    audiomap1="ja"
    elif [ "$aud" == "2" ]; then
    audiomap="-map 0:0 -map 0:1 -map 0:s"
    audiomap1="nein"
    elif [ "$aud" == "3" ]; then
    audiomap="-map 0:0 -map 0:2 -map 0:s"
    audiomap1="ja"
    else
    echo -e "\e[5;93mBearbeutung wurde gestoppt, falsche Eingabe des Audioeinstellung.\033[00m"
    exit 1
  fi

  if [ "$profile" == "" ]; then
    echo -e "\e[5;93mKeine Profile eingegeben, daher wird hier gestoppt.\033[00m"
    exit 1
    elif [ "$preset1" == "" ]; then
    echo -e "\e[5;93mKeine Presents für die Umstellung (1 Pass) eingegeben.\nDaher wird hier gestoppt.\033[00m"
    exit 1
    elif [ "$preset2" == "" ]; then
    echo -e "\e[5;93mKeine Presents für die Umstellung (2 Pass) eingegeben.\nDaher wird hier gestoppt.\033[00m"
    exit 1
    elif [ "$kbit" == "" ]; then
    echo -e "\e[5;93mKeine durchschnittliche Videobitrate eingegeben.\nDaher wird hier gestoppt.\033[00m"
    exit 1
    elif [ "$kmax" == "" ]; then
    echo -e "\e[5;93mKeine Maximale Videobitrate eingegeben.\nDaher wird hier gestoppt.\033[00m"
    exit 1
  fi

  if [ "$fps" == "" ]; then
    echo -e "\e[5;93mKeine FPS eingegeben.\nDaher wird hier gestoppt.\033[00m"
    exit 1
    elif [ "$fps" == "0" ]; then
    fps1=""
    else
    fps1="-r $fps"
  fi

  if [[ "$corp0" == "0" && "$logo0" == "0" ]]; then
    ext1=""
    ext2=""
    elif [[ "$corp0" == "1" && "$logo0" == "0" ]]; then
    ext1="-vf $corp1=$corpa:$corpb:$corpx:$corpy"
    ext2="-vf $corp1=$corpa:$corpb:$corpx:$corpy"
    corp2="$corp1=$corpa:$corpb:$corpx:$corpy"
    elif [[ "$corp0" == "0" && "$logo0" == "1" ]]; then
    ext1=""
    ext2="-vf $logo1=x=$logox:y=$logoy:w=$logow:h=$logoh"
    logo2="$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh"
    elif [[ "$corp0" == "1" && "$logo0" == "1" ]]; then
    ext1="-vf $corp1=$corpa:$corpb:$corpx:$corpy"
    ext2="-vf $corp1=$corpa:$corpb:$corpx:$corpy,$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh"
    corp2="$corp1=$corpa:$corpb:$corpx:$corpy"
    logo2="$logo1=x=$logox:y=$logoy:w=$logow:h=$logoh"
  fi

  echo -e "\e[7;49;95m--- Einstellungen: ---\033[00m"
  echo -e "\033[32mVideoformat:		\e[25;36m$format\033[00m"
  echo -e "\033[32mDateiendung:		\e[25;36m$endung\033[00m"
  echo -e "\033[32mProfil:			\e[25;36m$profile\033[00m"
  echo -e "\033[32mPresents 1 Pass:	\e[25;36m$preset1\033[00m"
  echo -e "\033[32mPresents 2 Pass:	\e[25;36m$preset2\033[00m"
  echo -e "\033[32mBitrate:		\e[25;36m$kbit\033[00m"
  echo -e "\033[32mMin-Bitrate:		\e[25;36m$min\033[00m"
  echo -e "\033[32mMax-Bitrate:		\e[25;36m$kmax\033[00m"
  echo -e "\033[32mFPS:			\e[25;36m$fps\033[00m"
  echo -e "\033[32mUntetitel:		\e[25;36m$sub2\033[00m"
  echo -e "\033[32mAudio:			\e[25;36m$aencoder\033[00m"
#  echo -e "\033[32mAudio Bitrate:		\e[25;36m$bitaudio\033[00m"
  echo -e "\033[32mAudiospur wechsel:	\e[25;36m$audiomap1\033[00m"
  if [ "$aud" == "0" ]; then
    echo -e "\033[32mErste Audiosprache:	\e[25;36m$language1\033[00m"
    echo -e "\033[32mZweite Audiosprache:	\e[25;36m$language2\033[00m"
    elif [ "$aud" == "1" ]; then
    echo -e "\033[32mErste Audiosprache:	\e[25;36m$language1\033[00m"
    echo -e "\033[32mZweite Audiosprache:	\e[25;36m$language2\033[00m"
    else
    echo -e "\033[32mAudiosprache:		\e[25;36m$language1\033[00m"
  fi
  if [ "$corp0" == "1" ]; then
    echo -e "\033[32mRämder entfernen:	\e[25;36m$corp2\033[00m"
  fi
  if [ "$logo0" == "1" ]; then
    echo -e "\033[32mLogo entfernen:		\e[25;36m$logo2\033[00m"
  fi
  echo " "
  echo -e "Sind die Einstellungen richtig, soll fortgefahren werden?"
  read -p "j/n: " ok

echo " "
echo " "

  if [ "$ok" == "j" ]; then
    echo -e "\e[5;93mBearbeitung wird gestartet.\033[00m"
    elif [ "$ok" == "n" ]; then
    echo -e "\e[5;93mBearbeutung wurde gestoppt.\033[00m"
    exit 0
    else
    echo -e "\e[5;93mFalsche eingabe. Bearbeutung wurde gestoppt.\033[00m"
    exit 1
  fi

echo " "
echo " "

for file in *{.vob,.pva,.m2t,.ts,.mpg,.avi,.mp4,.mkv} ; do

    FILENAME=$(basename "$file")
    NAME=`echo $FILENAME | cut -d'.' -f1`

    echo " "
    echo " "
    echo -e "\033[96mStarte Umstellung von \e[36m'$NAME'\033[96m.\033[00m"
    echo " "
    echo " "
    echo " "
    echo -e "\033[36mVideo Umstellung gestartet.\033[00m"

##1 Pass
/usr/bin/ffmpeg -cpuflags +cmov+sse4.2 -threads 4 $hwaccel -y -i "$DIRA"/"$file" $ext1 $audiomap -preset $preset1 -c:v libx265 -x265-params "input-depth=12:profile=$profile:no-sao=1:level=5.2:aq-mode=3:crf=0:high-tier=1:level-idc=52:output-depth=12" -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 -b:v $kbit -minrate $min -maxrate $kmax -bufsize 256M $fps1 -x265-params pass=1:stats="$DIRB"/"$NAME".log -an -sn -f $format -8x8dct 1 -b-pyramid 2 -mixed-refs 1 -refs 4 -weightp 1 /dev/null

##2 Pass
/usr/bin/ffmpeg -cpuflags +cmov+sse4.2 -threads 4 $hwaccel -i "$DIRA"/"$file" $ext2 $audiomap -c:v libx265 -preset $preset2 -x265-params "input-depth=12:profile=$profile:no-sao=1:level=5.2:aq-mode=3:crf=0:high-tier=1:level-idc=52:output-depth=12" -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 -qmin 0 -qmax 69 -qcomp 0.60 -qdiff 4 -i_qfactor 1.40 -b:v $kbit -minrate $min -maxrate $kmax -bufsize 256M $fps1 -x265-params pass=2:stats="$DIRB"/"$NAME".log $sub -c:a $aencoder -vbr 3 -metadata:s:a:0 language=$language1 -metadata:s:a:1 language=$language2 -8x8dct 1 -mixed-refs 1 -refs 4 -b-pyramid 2 -weightp 1 -f $format "$DIRB"/"$NAME"-bearbeitung.$endung

  if [ $? -eq 0 ]; then
  echo -e "\033[36mVerschieben der fertigen Datei.\033[00m"
   if [ -f "$DIRA"/"$file" ]
     then
      rm "$DIRB"/"$NAME".log
      rm "$DIRB"/"$NAME".log.cutree
      mv "$DIRA"/"$file" "$DIRC"
      mv "$DIRB"/"$NAME"-bearbeitung.$endung "$DIRD"/"$NAME"-fertig.$endung
      echo " "
      echo " "
      echo " "
      echo -e "\033[3;96mUmstellung von \e[36m'$NAME'\033[96m abgeschlossen.\033[00m"
     else
      echo -e "\e[93mKeine Datei verschoben!\033[00m"
    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

cvlc -q $endsnd
echo " "
echo " "
echo " "
echo " "
echo " "
echo -e "\033[01;03mUmstellung ist komplett Abgeschlossen!\033[00m"

exit 0

Changelog:
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 Text 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 hinzugefügt.