echo ======================================================
echo ======= $0 =======
echo Parameter:
echo Param1 $1 Param2 $2 Param3 $3
echo Pfad:
pwd
echo Dateien im Verzeichnis:
ls
maxtime="72:00:00";
TmpVid="./tmp/";
echo maxtime=$maxtime - derzeit festgelegtes Maximum, bei Bedarf einen hoeheren Wert definieren
echo TempDir fuer Operation w: $TmpVid
## optionale Parameter für ffmpeg
## map="-map 0:0 -map 0:1 -map 0:2 -ignore_unknown"
if [ "$1" == "-h" -o "$1" == "" ]; then
echo Features:
echo - Videos zusammenfügen
echo - Video splitten
echo - Werbepausen herausschneiden
echo - Anfang oder Ende abschneiden
echo - Videosplitter video, video_1, ... zusammenfügen - speziell für Digitnow Capture device
echo - transcode Videos zu .h264 mp4 Container
echo ### help ###
echo Hilfe:
echo splitvideo.sh a[nfang] time
echo splitvideo.sh b{ende} time [dauer]
echo splitvideo.sh c[oncat]
echo splitvideo.sh s[plit] time [time]
echo splitvideo.sh w[ithout] time time
echo splitvideo.sh f[ull]
echo splitvideo.sh t[ranscode] [transcodeparameter]
echo Beispiel:
echo splitvideo.sh a 01:00:00 - liefert das Video von 0 bis 1 Stunde
echo splitvideo.sh b 01:00:00 - liefert das Video von 1 Std bis Ende
echo splitvideo.sh b 01:00:00 00:30:00 - liefert von 1 Std bis 1:30h
echo splitvideo.sh s 01:00:00 - split bei 1 Std
echo splitvideo.sh s 01:00:00 01:30:00 - split bis 1 Std und ab 1:30h
echo splitvideo.sh c - verbindet alle Videos in alphabet. Reihenfolge
echo splitvideo.sh w 01:00:00 01:30:00 - entf. 1 Std bis 1:30h
echo splitvideo.sh r - refresh - schreibt alle Container neu, Originaldateien erhalten die Endung _old
echo splitvideo.sh f - verbindet alle Videos nach dem Muster file.mp4 file_1.mp4 .. nach _file.mp4
echo splitvideo.sh t - transcode alle Videocontainer mkv, wmv, mpeg2, h265, h264 zu video.Mp4
echo splitvideo.sh t \"-preset slow -crf 19 -vf scale=960:-2\" - transcode mit Parametern
echo ###
echo warning: option f is especially designed for the sake of video capture devices, which split videos at 2GB
echo keep cautious, there is much room for unexpected side effects, backup your data before use!!
echo no root permission required, if you run into problems you can try with sudo -i though
fi
# Hinweis: temporaere Verzeichnisse werden mit 'sudo chown nobody:nogroup concat*; sudo chmod 777 concat*;' zugaenglich gemacht
# bei Nutzung im Netzwerk, kann es sonst Zugriffsfehler geben.
#Rootrechte
#sudo -i
#without
if [[ "$1" == "w"* ]]; then
if [ "$2" != "" ]; then
if [ "$3" != "" ]; then
# make tempfolder (if not exists)
mkdir "$TmpVid";
# read config
if test -f "$(dirname $0)"/splitvideoconfig.sh; then
sudo chmod +x "$(dirname $0)"/splitvideoconfig.sh;
"$(dirname $0)"/splitvideoconfig.sh;
fi
sudo chown nobody:nogroup "$TmpVid"; sudo chmod 777 "$TmpVid";
rm "$TmpVid"anfang.mp4 "$TmpVid"anfang_bak.mp4 "$TmpVid"bisende.mp4 "$TmpVid"bisende_bak.mp4
mv "$TmpVid"anfang.mp4 "$TmpVid"anfang_bak.mp4; mv "$TmpVid"bisende.mp4 "$TmpVid"bisende_bak.mp4
#maxtime=06:00:00;
#write beginning
cuttime=$2; for i in *.*; do infile="$i"; done; echo $cuttime $infile;
ffmpeg -ss 00:00:00 -t "$cuttime" -i "$infile" -c copy "$TmpVid"anfang.mp4;
touch -r "$infile" "$TmpVid"anfang.mp4;
#write middle
ffmpeg -ss $cuttime -t 555 -i "$infile" -c copy "$TmpVid"mitte.mp4;
touch -r "$infile" "$TmpVid"mitte.mp4;
rm "$TmpVid"mitte_"$infile"
mv "$TmpVid"mitte.mp4 "$TmpVid"mitte_"$infile"
#write end
if [ "$3" != "" ]; then cuttime=$3; fi
ffmpeg -ss $cuttime -t "$maxtime" -i "$infile" -c copy "$TmpVid"bisende.mp4;
touch -r "$infile" "$TmpVid"bisende.mp4;
echo mv "$infile" "$infile"_bak.ts
mv "$infile" "$infile"_bak.ts
rm mylist.txt; rm mylist.old;
for f in "$TmpVid"anfang.mp4 "$TmpVid"bisende.mp4; do lastfile="$f"; echo "file '$f'"; echo "file '$f'" >> mylist.txt; done;
ffmpeg -f concat -safe 0 -i mylist.txt -c copy "$infile";
touch -r "$lastfile" "$infile";
cp mylist.txt mylist.old;
rm mylist.txt; rm mylist.old;
#rm anfang.mp4 bisende.mp4
mv "$TmpVid"anfang.mp4 "$TmpVid"anfang_bak.mp4
mv "$TmpVid"bisende.mp4 "$TmpVid"bisende_bak.mp4
#mv outfile.mp4 "$infile"
else
echo parameter fehlt
fi
fi
fi
#split
if [[ "$1" == "s"* ]]; then
if [ "$2" != "" ]; then
mv anfang.mp4 anfang_bak.mp4; mv bisende.mp4 bisende_bak.mp4
#maxtime=24:00:00;
cuttime=$2; for i in *.*; do infile="$i"; done; echo $cuttime $infile;
ffmpeg -ss 00:00:00 -t "$cuttime" -i "$infile" -c copy anfang_"$infile";
touch -r "$infile" anfang_"$infile";
if [ "$3" != "" ]; then cuttime=$3; fi
ffmpeg -ss $cuttime -t "$maxtime" -i "$infile" -c copy bisende_"$infile";
touch -r "$infile" bisende_"$infile";
else
echo parameter fehlt
fi
fi
#anfang -> liefert den Anfang -> ~anfang.mp4
if [[ "$1" == "a"* ]]; then
if [ "$2" != "" ]; then
rm anfang.mp4;
mv anfang.mp4 anfang_bak.mp4; mv bisende.mp4 bisende_bak.mp4
#maxtime=24:00:00;
cuttime=$2; for i in *.*; do infile="$i"; done; echo $cuttime $infile;
ffmpeg -ss 00:00:00 -t "$cuttime" -i "$infile" -c copy anfang_"$infile";
##ffmpeg -ss $cuttime -t "$maxtime" -i "$infile" -c copy bisende.mp4;
touch -r "$infile" anfang_"$infile";
else
echo parameter fehlt
fi
fi
#bis -> liefert das Ende -> bisende.mp4
if [[ "$1" == "b"* ]]; then
if [ "$2" != "" ]; then
rm bisende.mp4;
mv anfang.mp4 anfang_bak.mp4; mv bisende.mp4 bisende_bak.mp4
#maxtime=24:00:00;
cuttime=$2; for i in *.*; do infile="$i"; done; echo $cuttime $infile;
if [ "$3" != "" ]; then maxtime=$3; fi
##ffmpeg -ss 00:00:00 -t "$cuttime" -i "$infile" -c copy anfang.mp4;
ffmpeg -ss $cuttime -t "$maxtime" -i "$infile" -c copy bisende_"$infile";
touch -r "$infile" bisende_"$infile";
else
echo parameter fehlt
fi
fi
#concat -> vebindet alle videos im Verzeichnis -> _<firstfile>
if [[ "$1" == "c"* ]]; then
rm mylist.txt;
rm mylist.old;
for f in *.*; do firstfile="$f"; break; done;
for f in *.*; do lastfile="$f"; echo "file '$f'"; echo "file '$f'" >> mylist.txt; done;
ffmpeg -f concat -safe 0 -i mylist.txt -c copy outfile.mp4;
touch -r "$firstfile" outfile.mp4;
mv outfile.mp4 _"$firstfile"
mv mylist.txt mylist.old;
fi
#refresh -> schreibt alle files neu -> outfiletemp.mp4 -> $infile
if [[ "$1" == "r"* ]]; then
rm mylist.txt; rm mylist.old;
for infile in *.*; do
ffmpeg -ss 00:00:00 -t 09:00:00 -i "$infile" -c copy outfiletemp.mp4;
touch -r "$infile" outfiletemp.mp4;
#touch -r outfiletemp.mp4 "$infile";
mv "$infile" "$infile"_old
mv outfiletemp.mp4 "$infile"
done;
fi
#full -> verbindet alle files nach dem Muster file.mp4 file_1.mp4 .. -> _file.mp4
#(fuer Videosschnipsel vom DigitNow Videograbber, andere Geraete haben evtl. ein anderes Namensschema)
if [[ "$1" == "f"* ]]; then
if ls *P_1.mp4 1> /dev/null 2>&1; then
echo Konflikt festgestellt, Dateiname nicht verarbeitbar
ls *P_1.mp4
ls *P_1_1.mp4
echo bitte Dateinamen aendern von datei_1.mp4 zu datei_01.mp4 bzw. datei_01_1.mp4 etc.
exit
fi
if ls *_10.mp4 1> /dev/null 2>&1; then
echo Konflikt festgestellt, Datei nicht verarbeitbar
ls *_10.mp4 # oder ls *_1[0,1-9].mp4
echo bitte Dateinamen aendern von datei_10.mp4 zu dateix10.mp4
else
if test -d concat1; then
echo "directory exists"
else
if ls *_1.mp4 1> /dev/null 2>&1; then
#ls *[0-9]_1.mp4; ls *_1.mp4
## !! Selbstaufruf des Skripts mit $0 c !!
unset fg fh fi fk; fcount=0; for fg in *_1.mp4; do echo file: $fg ; fh=${fg//_1.mp4/}; fcount=$((fcount+1)); mkdir concat$fcount; sudo chown nobody:nogroup concat$fcount; sudo chmod 777 concat$fcount; echo $fcount; for fi in "$fh"*; do echo $fi; mv -n "$fi" ./concat$fcount/; done; cd concat$fcount; for fk in *.*; do firstfile="$fk"; break; done; $0 c; mv -n _"$fk" ../; cd ..; done;
else
echo no files found for concat
fi
fi
fi
fi
#transcode -> wandelt alle Videocontainer (mkv, wmv, mpeg2, h265, h264) im Verzeichnis zu -> video.Mp4
#Optional kann Qualität und Aufloesung mitgegeben werden "-preset slow -crf 19 -vf scale=960:540"
#Hinweis: crf (constant rate factor): 18-20 Spielfilmqualität, 22-26 Dokumentationen, unter 18 bringt nichts, ueber 30 gibt Artefakte
#crf - konstante qualitet, cbr - constant bitrate (wird nicht mehr verwendet)
#cbr ist nur bei Leitungen oder Geraeten mit konstanter Bitrate zu empfehlen. Wenn ausgerechnet die rasante Verfolgungsjagd
#verpixelt wird, kann man das Video wegwerfen. Deshalb wird heutzutage kommerziell eine Mischform
#verwendet, mit konstanter Qualitaet aber festgelegtem Limit und einem Vorlaufpuffer.
#### noch nicht getestet
if [[ "$1" == "t"* ]]; then
#transcodeparam="-preset slow -crf 19 -vf scale=960:540"
#transcodeparam="-preset slow -crf 19 -vf scale=960:-2"
transcodeparam="-preset slow -crf 20"
if [ "$2" != "" ]; then
transcodeparam="$2"
fi
for i in *.*; do
date; echo "$i"; begin=$(date +%s);
#ffmpeg -i "$i" -c:v libx264 -threads 0 -preset slow -crf 19 -vf scale=960:540 "$i".Mp4;
ffmpeg -i "$i" -c:v libx264 -threads 0 $transcodeparam "$i".Mp4;
now=$(date +%s); diff=$(($now - $begin)); mins=$(($diff / 60)); secs=$(($diff % 60)); touch -r "$i" "$i".Mp4;
echo "Time $mins:$(printf %02d $secs) $i $diff";
done;
fi
#-----------------------------------------
#Letztes Update.
#17.10.2019 - Parameter f(ull) hinzugefügt
# Vorüberlegung:
# Videoaufnahmen werden vom Capture device gesplittet nach dem Muster: video.mp4, video_1.mp4, ...
# jede gesplittete Videoaufnahme enthält daher genau einen Kandidaten: video_1.mp4
# Algorithmus:
# - Suche nach einer Datei mit dem Muster <file>_1.mp4
# - Verschiebe alle Dateien mit der Maske <file>* in das temporaere Verzeichnis Concat1
# - Zusammenfügen der Dateien im temporaeren Verzeichnis
# - Wiederhole
#17.12.2019 Aenderungen:
#- chmod 777 fuer temporaere Verzeichnisse, um den Zugriff mit Samba im Netz zu erlauben,
# Hintergrund ist, wenn aus Performance Gruenden eine lokale schnelle SSD benutzt wird, ist der Anwendung
# der Netzwerkkontext zunächst einmal nicht bekannt, dafuer gibt es auch keine allgemeingueltige Loesung.
# Allerdings ist das Thema auf einem Board, das der Videobearbeitung gewidmet ist, wenig relevant..
# Die Berechtigungsstruktur wird in diesem Fall durch die Netzwerkkonfiguration abgebildet..
# Bei Bedarf kann der Zugriff z. Bsp.mit chmod 664 und chown Netzuser Netzgruppe angepasst werden.
#- Ausgabedateien heissen nun anfang_<firstfile> bzw bisende<firstfile> statt einfach anfang.mp4 bzw bisende.mp4
#- Die concat Ausgabedatei erhaelt nun den Zeitstempel von firstfile statt den der zuletzt hinzugefuegten Datei.
#19.12.2019 Parameter t(ranscode) hinzugefügt
#5.1.2019 Korrektur bei Parameter f: ## !! Selbstaufruf des Skripts mit $0 c !! (statt absoluter Pfad)
#18.3.20 Temp Folder für Operation w eingeführt
# Hintergrund ist, dass es möglich ist den Temp Ordner auf einem separaten LW anzulegen,
# dadurch ergibt sich eine bessere Performance
#18.3.20 sudo wurde den Kommandos chmod und chown vorangestellt (Operationen f und w)
#18.3.20 Optionales Config File hinzugefuegt
# Pfad: selbes Verzeichnis wie Skript
# Name: splitvideoconfig.sh
# Inhalt: TmpVid="./tmp/"; # oder alternatives Verzeichnis angeben
# das Konfigurationsfile gilt derzeit nur fuer w[ithout], falls nicht vorhanden gilt der Standardwert
# 4.3.2020 Korrektur bei r[efresh]
# alt: mv $infile "$infile"_old
# alt: mv outfiletemp.mp4 $infile
# neu: mv "$infile" "$infile"_old
# neu: mv outfiletemp.mp4 "$infile"