Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Batch Konvertierung mit ffmpeg

  1. #1
    Registrierter Benutzer
    Registriert seit
    Apr 2015
    Beiträge
    31

    Batch Konvertierung mit ffmpeg

    Liebe Gemeinde, ich habe eine Skript geschrieben, dass mir meine Kameravideos als Batch mit einem aktuellen Videocodec (H264) umrechnen soll. Hier seht ihr meinen Versuchsordner ~/Bilder/Videos
    Code:
    adi@bigdestruction ~/Bilder/Videos $ ll
    total 24776
    drwxr-xr-x 2 adi adi     4096 Feb 19 06:26 ./
    drwxr-xr-x 7 adi adi     4096 Feb 19 06:26 ../
    -rwxrw-r-- 1 adi adi      555 Feb 19 06:25 convert_mp4_mp4.sh*
    -rw-r--r-- 1 adi adi 13021784 Jan 28 10:32 P1010067_old.MP4
    -rw-r--r-- 1 adi adi 12307391 Feb 19 03:03 P1010067_standard.mp4
    mein skript schaut so aus, an den neuen Dateinamen soll "_new" drangehängt werden.
    Code:
    #!/bin/bash
    # converts *.all videos in the directory into *.mp4 container with h264- video codec
    
    function convert {
            oldname=$1
            newname=${1%.*}_new.mp4
            if [ -a "$newname_new" ]; then
                    echo "$newname_new already exists"
            else
                    echo "Converting $oldname to $newname"
                    ffmpeg -i "$oldname" -vcodec libx264 -acodec mp3 "$newname"
            fi
    }
    
    # - maxdepth1... don't enter Ordner recuslively
    # | while IFS= read -r file ... don't be irritated by spaces in the name of file
    
    find . -maxdepth 1 -name '*.mp4' | while IFS= read -r file; do
            convert "$file"
    done
    Wenn ich das Skript durchlaufen lasse konvertiert er die Datei "P1010067_standard.mp4" (man beachte den Größenunterschied) und macht die Schleife für die anderen Dateien nicht weiter.
    Code:
    adi@bigdestruction ~/Bilder/Videos $ ll
    total 29492
    drwxr-xr-x 2 adi adi     4096 Feb 19 06:28 ./
    drwxr-xr-x 7 adi adi     4096 Feb 19 06:26 ../
    -rwxrw-r-- 1 adi adi      555 Feb 19 06:25 convert_mp4_mp4.sh*
    -rw-r--r-- 1 adi adi 13021784 Jan 28 10:32 P1010067_old.MP4
    -rw-r--r-- 1 adi adi 12307391 Feb 19 03:03 P1010067_standard.mp4
    -rw-r--r-- 1 adi adi  4818947 Feb 19 06:27 P1010067_standard_new.mp4
    Was läuft hier falsch, dass die Schleife nur ein mal durchlaufen wird?
    Frage aus Neugier, weil ich als Anfänger die Lösung nicht finde... wenn ich an Dateinamen an einer anderen Stelle zusammenfügen möchte, funktioniort das überhaupt nicht, ich bin selbst darauf gekommen, dass der Dateiname sowieso falsch zu "P1010067_standard.mp4_new" zusammengesetzt werden sollte
    Code:
    #!/bin/bash
    # converts *.all videos in the directory into *.mp4 container with h264- video codec
    
    function convert {
            oldname=$1
            newname=${1%.*}.mp4
            if [ -a "$newname_new" ]; then
                    echo "$newname_new already exists"
            else
                    echo "Converting $oldname to $newname_new"
                    ffmpeg -i "$oldname" -vcodec libx264 -acodec mp3 "$newname_new"
            fi
    }
    
    # - maxdepth1... don't enter Ordner recuslively
    # | while IFS= read -r file ... don't be irritated by spaces in the name of file
    
    find . -maxdepth 1 -name '*.mp4' | while IFS= read -r file; do
            convert "$file"
    done
    aber warum diese Fehlermeldung? Ist es weil es das Dateiformat *.mp4_new nicht gibt?
    [NULL @ 0x8434e0] Unable to find a suitable output format for ''
    : Invalid argument
    Danke und Lg

  2. #2
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.054
    ich hab den rest nicht ausprobiert, aber grundlegend solltest Du
    Code:
    $newname_new
    besser als
    Code:
    ${newname}_new
    schreiben.

    Für die Rest-Probleme würde ich Debug-Ausgaben einbauen.
    Ich bin root - ich darf das.

  3. #3
    Elefantenversteher Avatar von florian0285
    Registriert seit
    Jun 2016
    Beiträge
    1.054
    Zitat Zitat von MuppetShow12 Beitrag anzeigen
    [NULL @ 0x8434e0] Unable to find a suitable output format for ''
    : Invalid argument
    Danke und Lg
    Die Referenz auf die Adresse ist leer, weil kein Wert in $file vorhanden ist.

    Mir persönlich gefällt die for-Schleife lieber:
    http://tldp.org/LDP/Bash-Beginners-G...ect_09_01.html

    find da jetzt so an while durchzureichen hätt ich auch noch nicht gesehen, muss aber nicht falsch sein.
    Matthäus 7:3 Was siehst du aber den Splitter in deines Bruders Auge, und wirst nicht gewahr des Balkens in deinem Auge?

  4. #4
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.054
    man könnte find auch noch mit -exec aufrufen...
    Ich bin root - ich darf das.

  5. #5
    Registrierter Benutzer
    Registriert seit
    Apr 2015
    Beiträge
    31
    Dieser Befehl "while IFS= read -r file" ignoriert die Leerzeichen in einem Namen (ich hab den Befehl aus einem mp3 Konvertierungs-Tool zweckentfremdet, weil mp3s haben oft Leerzeichen im Namen)
    Zitat Zitat von marce Beitrag anzeigen
    man könnte find auch noch mit -exec aufrufen...
    Das habe ich schon versucht, nämlich so:
    Code:
    find . -maxdepth 1 -name "*.MP4" -exec convert {} \;
    bei der convert-Funktion wird ein Argument erwartet, das hier fehlt - wie man das mit -exec weitergibt weiß ich nicht - die shell versucht in dem Fall außerdem den shell-befehl convert (für Images) auszuführen - das endet in einer Fehlermeldung.
    Aber noch einmal zum Problem: Warum wird das nur eine Datei konvertiert? Ich habe mittlerweile einen Fehler/Unachtsamkeit gefunden und der liegt in der Groß-/Kleinschreibung der Dateiendung (Meine Kamera nimmt die Endung "MP4" anstatt "mp4") somit auch nur im richtigen find-Befehl erkannt... Der find-Befehl an sich sollte aber schon funktionieren, siehe letzte Zeile im nachfolgenden Terminal-Code
    Code:
    adi@bigdestruction ~/Bilder/Videos $ ll
    total 36092
    drwxr-xr-x 2 adi adi     4096 Feb 19 21:50 ./
    drwxr-xr-x 7 adi adi     4096 Feb 19 13:31 ../
    -rwxr--r-- 1 adi adi      680 Feb 19 21:50 convert_mp4_mp4.sh*
    -rw-r--r-- 1 adi adi 13021784 Jan 28 17:32 P1010067.MP4
    -rw-r--r-- 1 adi adi 13021784 Jan 28 17:32 P1010067_old.MP4
    -rw-r--r-- 1 adi adi 10846831 Jan 28 17:53 P1010069.MP4
    adi@bigdestruction ~/Bilder/Videos $ ./convert_mp4_mp4.sh 
    Converting ./P1010067.MP4 to ./P1010067_new.mp4
    adi@bigdestruction ~/Bilder/Videos $ ll
    total 40808
    drwxr-xr-x 2 adi adi     4096 Feb 19 21:51 ./
    drwxr-xr-x 7 adi adi     4096 Feb 19 13:31 ../
    -rwxr--r-- 1 adi adi      680 Feb 19 21:50 convert_mp4_mp4.sh*
    -rw-r--r-- 1 adi adi 13021784 Jan 28 17:32 P1010067.MP4
    -rw-r--r-- 1 adi adi  4818947 Feb 19 21:51 P1010067_new.mp4
    -rw-r--r-- 1 adi adi 13021784 Jan 28 17:32 P1010067_old.MP4
    -rw-r--r-- 1 adi adi 10846831 Jan 28 17:53 P1010069.MP4
    adi@bigdestruction ~/Bilder/Videos $ find . -maxdepth 1 -name '*.MP4' | while IFS= read -r file; do echo $file;done
    ./P1010067.MP4
    ./P1010067_old.MP4
    ./P1010069.MP4
    Wie man sieht wurde nur die Datei "P1010067_new.mp4" erstellt...
    Geändert von MuppetShow12 (19.02.17 um 15:33 Uhr)

  6. #6
    Elefantenversteher Avatar von florian0285
    Registriert seit
    Jun 2016
    Beiträge
    1.054
    Matthäus 7:3 Was siehst du aber den Splitter in deines Bruders Auge, und wirst nicht gewahr des Balkens in deinem Auge?

  7. #7
    Registrierter Benutzer
    Registriert seit
    Apr 2015
    Beiträge
    31
    Die Schleife geht doch... oder verstehe ich etwas falsch?
    Code:
    adi@bigdestruction ~/Bilder/Videos $ find . -maxdepth 1 -name '*.MP4' | while IFS= read -r file; do echo $file;done
    ./P1010067.MP4
    ./P1010067_old.MP4
    ./P1010069.MP4

  8. #8
    Elefantenversteher Avatar von florian0285
    Registriert seit
    Jun 2016
    Beiträge
    1.054
    Zitat Zitat von MuppetShow12 Beitrag anzeigen
    Die Schleife geht doch... oder verstehe ich etwas falsch?
    Nicht richtig eben...

    Zitat Zitat von MuppetShow12 Beitrag anzeigen
    Was läuft hier falsch, dass die Schleife nur ein mal durchlaufen wird?
    probier mal:

    Code:
    for f in *.mp4
    do convert $f
    done
    das läuft bei mir mit "avidemux -optionen $f usw." problemlos.
    Geändert von florian0285 (20.02.17 um 21:58 Uhr)
    Matthäus 7:3 Was siehst du aber den Splitter in deines Bruders Auge, und wirst nicht gewahr des Balkens in deinem Auge?

  9. #9
    Registrierter Benutzer Avatar von snowcrash23
    Registriert seit
    Jun 2006
    Ort
    Unbekannt Verzogen
    Beiträge
    577
    Mit folgenden kleinen Änderung läuft es bei mir durch, habe vor einiger Zeit mal ein ähnliches Script gebaut. Kann leider nicht mehr sagen was das < /dev/null genau bewirkt, vielleicht kann hier noch jemand Licht ins dunkel bringen.
    Code:
    #!/bin/bash
    # converts *.all videos in the directory into *.mp4 container with h264- video codec
    
    function convert_me {
    	oldname=$(basename $1)
            newname=${oldname%.*}_new.mp4
            
    	if [ -e "$newname" ]; then
                    echo "$newname" already exists.
            else
                    echo Converting "$1" to "$newname"
                    ffmpeg -i "$1" -vcodec libx264 -acodec mp3 "$newname" < /dev/null
            fi
    }
    
    find . -iname '*.mp4' | while read file; do
            convert_me "$file"
    done
    MfG
    snowcrash23
    OS:Arch LinuxCPU:Core i5-2500K
    MB:P8P67PRORAM:16GB DDR3GK:NV GTX570

    Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

  10. #10
    Registrierter Benutzer
    Registriert seit
    Apr 2015
    Beiträge
    31
    Hallo alle, es lag offensichtlich doch an diesem "while IFS= read -r file;" Ich habe jetzt die for-Schleife gemacht (Danke an florian0285) und jetzt funktioniert es. Ich wollte bis zum Schluss nicht glauben dass es daran gelegen hat, da ich genau so vor ca. 1 Jahr mp3-Namen eingelesen und abgeändert habe... Wie auch immer, die Lösung von snowcrash schaut für mich auch gut aus (nicht getestet, sollte aber gehen).
    Ich habe die alten Videos der Ordnung in einen separaten Ordner geschoben... anbei die ganze Lösung:
    Code:
    function convert {
    	oldname=$1
    	newname=${1%.*}.mp4
    	if [ -a "$newname" ]; then
    		echo "$newname already exists"
    	else
    		echo "Converting $oldname to $newname"
    		ffmpeg -i "$oldname" -vcodec libx264 -acodec libvo_aacenc "$newname"
    		mv -v ./$oldname ./old_Videos/$oldname
    	fi
    }
    
    # - maxdepth1... don't enter Ordner recuslively
    # | while IFS= read -r file ... don't be irritated by spaces in the name of file
    
    # find . -maxdepth 1 -name '*.MP4' | while IFS= read -r file; do convert "$file" ; done
    mkdir ./old_Videos
    
    for file in *.MP4; do
        convert "$file"
        done
    Lg und danke!

Ähnliche Themen

  1. Videos konvertieren mit ffmpeg/ffmpeg-php
    Von streicher im Forum Anwendungen Allgemein, Software
    Antworten: 2
    Letzter Beitrag: 10.01.07, 18:17
  2. vid konvertierung mit tovid
    Von Bayerfans04 im Forum Anwendungen Allgemein, Software
    Antworten: 2
    Letzter Beitrag: 12.01.06, 11:13
  3. Liefert ffmpeg kein ffmpeg-config mit?
    Von damava im Forum Kompilieren von Kernel und Sourcen
    Antworten: 1
    Letzter Beitrag: 08.08.05, 23:09
  4. Konvertierung
    Von derkilian im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 14.07.05, 11:23
  5. lame --- Batch-Konvertierung
    Von Samba im Forum Musik
    Antworten: 6
    Letzter Beitrag: 12.01.03, 12:20

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •