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.


