Hilfe zu ffmpeg Dateihandling gesucht

Status
Für weitere Antworten geschlossen.

NSFH

Benutzer
Sehr erfahren
Mitglied seit
09. Nov 2016
Beiträge
3.979
Punkte für Reaktionen
516
Punkte
174
Hallo!
Vielleicht findet sich in diesem Forum ja jemand, der mir unter die Arme greifen kann.
Folgende Situation:

Eine VideoCam sendet per Internet Videoschnipsel an einen Linux Server.
Die Dateien landen in dem Ordner Video/Cam1

Dort sollen die Videos mittels ffmpeg mit einem Overlay versehen werden (Cronjob auf dem Server, der alle 10 Minuten anläuft)

Das einfache script für ffmpeg läuft: ffmpeg -i inputvideo.mp4 -i watermarklogo.png -filter_complex "overlay=main_w-overlay_w-0:0" -codec:a copy outputvideo.mp4

Die fertige Datei soll dann im Ordner Video/cam1/export gespeichert werden

Die originale Datei in den Ordner Video/cam1/originale verschoben werden.

Da die Dateien keine festen Namen haben muss das script also mit Wildcards funktionieren. Zu beachten ist auch, dass während der Bearbeitung eines Videos auch wieder neue Clips auflaufen, die zu Beginn des Konvertierungsprozesses noch nicht da waren. Daher kann ich nicht am Ende des Prozesses mit einem move die Originale verschieben, sondern dass muss Teil des Konvertierungs-Script sein.

Im Ablauf würde das so aussehen:
- Server schaut mittels Cronjob nach, ob eine/mehrere .mp4 Datei im Verz cam1 liegt
- Wenn ja nimmt er es, konvertiert und speichert es unter Export, verschiebt das Original in Originale
- Nächstes file ist dran
- Keine Files mehr da Job zu Ende

Lässt sich das realisieren? Bin für alle Hinweise dankbar!
 

Andy14

Benutzer
Mitglied seit
05. Mrz 2014
Beiträge
1.013
Punkte für Reaktionen
0
Punkte
0
Hatte mal etwas ähnliches gemacht. Surveillance Videos konvertiert und in einem VideoStation Verzeichnis abgelegt.
Bin aber auch nicht der script Experte ;-) aber vielleicht hilft ja mein "Versuch" bei der Erstellung eines eigenen!
Beim Start wird das Verzeichnis gelesen so das es in der Schleife egal ist ob neuere Videos hinzu kommen.
Am Ende wo bisher nur geschaut wird ob das konvertierte Video da ist könnte man das verschieben einfügen.

Rich (BBCode):
#!/bin/sh 

# Logdatei
LogFile='/volume1/homes/admin/copylog.txt'

# Ziel: Ausgabeverzeichniss (VideoStation)
VideoOut='/volume1/video/"MEINE_IPCAM_VIDEOS"/'

# Quelle: Surveillance Kamera Verzeichniss
StartDir='/volume1/surveillance/"MEINE_IP_CAM"'

# wurde eine Datei konvertiert
FileConf=


# Aktuellen Zeitstempel der Konvertierung
d=$(date +%y-%m-%d_%H:%M:%S)
echo "Konvertierungsprozess starten! $d" >> $LogFile


# Alle Verzeichnisse im Quellpfad suchen
AllDirs=`find "$StartDir" -mindepth 1 -maxdepth 1 -type d`
echo "" >> $LogFile
echo "Dirs: $AllDirs" >> $LogFile
# Alle gefundenen Unterverzeichnisse durchsuchen
for MyDir in $AllDirs; 
do
  # Alle Dateien im Verzeichniss "MyDir" suchen
  all_files=`find "$MyDir" -maxdepth 1 -type f`

  echo "" >> $LogFile
  echo "Verz  : $MyDir" >> $LogFile
  echo "Files : $all_files" >> $LogFile

  cd "$MyDir"

  # Alle mp4 Dateien konvertieren
  for file in $(find -name "*.mp4");
  do

    # Dateiname
    FName=$(basename "$file")
    # Datumspfad der Surveillance Station ohne AM/PM
    DateStart=${MyDir##*/}
    DateDir="${DateStart:0:8}"

    # Gibt es das Datumsverzeichniss schon
    if ! [ -d $VideoOut$DateDir ]; then
      mkdir $VideoOut$DateDir
    fi    

    echo "Quelle: $MyDir/$FName" >> $LogFile
    echo "Ziel  : $VideoOut$DateDir/$FName" >> $LogFile

    # Wurde die Datei schon konvertiert?
    if [ -f "$VideoOut$DateDir/$FName" ];then
      echo "konv  : ... ist schon konvertiert!       NO ffmpeg ." >> $LogFile
    else
      echo "konv  : ... ist noch nicht konvertiert!  START ffmpeg" >> $LogFile
      ffmpeg -i "$MyDir/$FName" -r 25 -y "$VideoOut$DateDir/$FName" 2> /volume1/homes/admin/fflog.txt;
      FileConf=true
    fi

    # Ist die Datei auch erstellt worden
    if [ -f "$VideoOut$DateDir/$FName" ];then
      echo "test  : ... ist im Ziel vorhanden!       ffmpeg OK" >> $LogFile
    else
      echo "test  : ... ist nicht im Ziel vorhanden! ffmpeg ERR" >> $LogFile
    fi

  done

  cd ..

done

# Index VideoStation erstellen
if [ $FileConf ]; then
  echo "Index : neu erstellen" >> $LogFile
  synoindex -R $VideoOut
fi
  
# Aktuellen Zeitstempel der Konvertierung
d=$(date +%y-%m-%d_%H:%M:%S)
echo "Fertig: $d" >> $LogFile
 

NSFH

Benutzer
Sehr erfahren
Mitglied seit
09. Nov 2016
Beiträge
3.979
Punkte für Reaktionen
516
Punkte
174
Danke für das Script, werde es mir mal zu Gemüte führen!
 

AndiHeitzer

Benutzer
Sehr erfahren
Mitglied seit
30. Jun 2015
Beiträge
3.214
Punkte für Reaktionen
503
Punkte
174
Was ich bei mir mache, ist eine TXT-Datei anlegen, wenn der Job losrennt.
Im Job selber prüfe ich vor dem Anlegen, ob es diese TXT-Datei schon gibt.
Ist die TXT-Datei vorhanden, dann steigt der Job aus.
Ist die TXT-Datei nicht vohanden, dann arbeite ich die Files ab und lösche die TXT-Datei, wenn der Job fertig ist.
 

NSFH

Benutzer
Sehr erfahren
Mitglied seit
09. Nov 2016
Beiträge
3.979
Punkte für Reaktionen
516
Punkte
174
Magst du mal dein Script hier posten?
 

AndiHeitzer

Benutzer
Sehr erfahren
Mitglied seit
30. Jun 2015
Beiträge
3.214
Punkte für Reaktionen
503
Punkte
174
Das komplette Script wäre zu lang ...

Aber die Abfrage auf eine bestimmte Datei:
Rich (BBCode):
##### If a convert is already running ...
if [ -f "${WORKPATH}_es-wird-gerade-konvertiert_" ]
    then
        echo Konvertierung rennt bereits ...
        date +"[%Y%m%d - %H%M%S] ${dateiname} - ENDE">>$LOGFILE
        exit 0
fi

Weiter unten im Script wird die Prüf-Datei erstellt und mit FFMPEG die vorhandenen Files bearbeitet ...

Rich (BBCode):
##### converting ...
echo > ${WORKPATH}_es-wird-gerade-konvertiert_
echo Es wird abgearbeitet: ${WORKPATH} >>${WORKLOG}
echo >>${WORKLOG}
date +"[%Y%m%d - %H%M%S] Konvertierung beginnt." >>${WORKLOG}
echo -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>${WORKLOG}


Soweit mal auf die Schnelle.
Du kannst also Dein vorhandenes Script belassen wie es ist, Du solltest also eine Prüf-Datei benutzen, damit sich nix überschneidet :eek:
 

bfpears

Benutzer
Mitglied seit
09. Feb 2009
Beiträge
449
Punkte für Reaktionen
29
Punkte
28
Also,
Andys Lösung ist schon gut mit Logfile und Unterordnern, mir persönlich etwas zu unübersichtlich.

Ich schicke öfter mal meine Mp4 durch eine FOR Schleife (habe für mich alles in eine Zeile bekommen)
habe jetzt noch die Move Zeile ergänzt
Rich (BBCode):
#!/bin/sh
for f in *.mp4; 
do 
  ffmpeg -i "$f" hier_deine_Parameter ./export/"$f"-Watermark.mp4;
  mv $f originale/;
done

Überschreiben und so wir dabei nicht abgefangen

BF
 

NSFH

Benutzer
Sehr erfahren
Mitglied seit
09. Nov 2016
Beiträge
3.979
Punkte für Reaktionen
516
Punkte
174
Reichlich Stoff zum Testen. Komme leider erst Montag dazu,werde dann berichten.
Danke schon mal bis hier hin!
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat