Mehrere Dateien in gleicher Weise konvertieren

  • .


    Wie kann man
    mehrere Dateien in gleicher Weise konvertieren

    (Stapelverarbeitung)


    Vorbemerkung


    Der VLC kann zwar mehrere in der Wiedergabeliste zusammengefasste audiovisuelle Objekte nacheinander wiedergeben. Er kann aber solche Objekte nicht nacheinander automatisiert konvertieren und speichern.


    Er kann uns aber dabei helfen, denn er nimmt, wenn er gestartet wird, Informationen, sogenannte Aufrufparameter entgegen. Damit können dem VLC ziemlich komplexe Aufträge erteilt werden, wie sie für das Konvertieren und Speichern erforderlich sind. Man braucht also nur eine Script-Datei, die solche Aufrufe auch für mehrere Dateien erzeugen kann.


    Für die nachfolgenden Erklärungen gehen wir davon aus, dass wir mehrere MP4-Dateien haben, aus denen wir jeweils den Audiostream als eigenständige MP3-Datei extrahieren wollen.


    Man kann aber selbstverständlich jede beliebige Aufgabe, die der VLC für eine einzelne Datei erledigen kann, über das beschriebene Verfahren in einem "Aufwasch" durch eine Stapelverarbeitung erledigen.


    Vorbereitung


    Eine Script-Datei ist eine einfache Textdatei, die man zum Beispiel in Windows erstellen kann, indem man mit der rechten Maustaste in den rechten Bereich des Explorers (Inhaltsbereich) klickt und im darauf sich öffnenden Kontextmenü über den Eintrag "Neu" die Optionen "Neues Textdokument" auswählt.


    Dieser neuen Textdatei geben wir einen neuen Namen mit der Namenserweiterung "cmd", zum Beispiel "VLC_Konverter.cmd". Sie soll ein eine Anweisungen aufnehmen, welche den VLC aufruft und ihm mitteilt, dass aus einer bestimmten Datei der Audioteil extrahiert und als eigenständige Datei gespeichert werden soll. Diese Anweisung soll nun in einer Schleife für jede zu konvertierende Datei wiederholt ausgeführt werden


    Durch einen Doppelklick auf eine solche CMD-Datei wird der zum Betriebssystem gehörender Interpreter aufgerufen und ihm diese Script-Datei übergeben. Der Interpreter wertet daraufhin das Script nach unseren Vorgaben aus.


    Schreiben des Scripts


    Schauen wir uns einfach einmal an, wie das fertige Script aussehen könnte:


    Code
    @ECHO OFFREM Transkodiert mp4-Video-Dateien zu mp3-Audio-DateienFOR %%a IN (*.mp4) DO "C:\Program Files (x86)\VideoLAN\vlc\vlc.exe" -I dummy -vvv "%%a" --sout=#transcode{vcodec=none,acodec=mpga,ab=128,channels=2,samplerate=44100}:std{access=file,mux=raw,dst="%%~na.mp3"} vlc://quitPAUSE


    Ziemlich kurz, aber auch ziemlich verwirrend denkt wohl jeder, der so etwas noch nie geschrieben hat. Deshalb soll es hier auch erklärt werden.


    Allerdings gibt es in diesem Script eine Zeile, die man nur zu einem Teil sehen kann und das hat auch seinen guten Grund. Es ist die Zeile, über die der VLC mit den schon erwähnten Aufrufparametern aufgerufen wird. Und da in dieser Zeile kein Zeilenumbruch vorkommen darf und der Auftrag doch ziemlich komplex ist, ist sie eben so lang, wie sie ist, keine gute Voraussetzung, wenn etwas erklärt werden soll, was man nicht so richtig komplett sehen kann.


    Deshalb hier der Inhalt dieses Scripts mit Zeilenschaltungen, die es aber nicht geben darf. Für Leerstellen, welche wegen der Zeilenschaltungen nicht mehr zu erkennen sind, wurde ein Unterstrich gesetzt.


    Code
    @ECHO OFFREM Transkodiert mp4-Video-Dateien zu mp3-Audio-DateienFOR %%a IN (*.mp4) DO "C:\Program Files (x86)\VideoLAN\vlc\vlc.exe"_-I dummy -vvv "%%a" --sout=#transcode_{vcodec=none,acodec=mpga,ab=128,channels=2,samplerate=44100}:std{access=file,mux=raw,dst="%%~na.mp3"} vlc://quitPAUSE


    Und nun die Erklärung des Scripts:

    • @ECHO OFF
      Das Programm, das unser Scrpt auswertet, ist etwas "redselig" und informiert uns über alles, was es gemacht hat durch eine Ausgabe auf dem Monitor. Da dadurch die Übersichtlichkeit nicht gerade besser wird, gibt es die Möglichkeit, mit dem Befehl @ECHO OFF diese "Redseligkeit" etwas einzudämmen. Wir könnten ohne Weiteres auch darauf verzichten.


    • REM Transkodiert mp4-Video-Dateien zu mp3-Audio-Dateien
      Alle Zeilen, welche mit dem Schlüsselwort "REM" beginnen, werden vom Interpreter des Scripts ignoriert. Man kann also damit, wie hier geschehen, einen Kommentar einfügen.


    • FOR %%a IN (*.mp4) DO
      Dieser Teil ist eine FOR-Schleife. Eine solche ermöglicht die mehrfache Ausführung eines Befehls mit einem variablen Argument.
      Dafür wird eine in Anführungszeichen gesetzte Schleifenvariable verwendet, in unserem Fall ist dies < %%a >, der bei jedem Durchlauf ein Argument zugewiesen wird, bei dem es sich um ein Objekt handeln muss, welches im Zugriffsbereich liegt und das der Beschreibung im geklammerten Teil nach dem Schlüsselwort IN entspricht, in unserem Fall ist dies < *.mp4>. Die Anführungszeichen verhindern Probleme mit Leerzeichen.
      Zugriffsbereich ist in unserem Beispiel der Ordner, von dem aus die Script-Datei gestartet wird.
      Der Stern in der Beschreibung bewirkt zweierlei: Er wird vom Interpreter des Scripts als Indiz dafür angesehen, dass es sich bei den beschriebenen Argumenten um Dateien handelt und er steht für jedes beliebige Zeichen.
      Damit trifft in unserem Fall die Beschreibung auf alle Dateien, die im selben Verzeichnis wie die Script-Datei liegen und die Namenserweiterung ".mp4" haben.
      Die FOR-Schleife in unserem Script wird also der Reihe nach jede Datei mit der Namenserweiterung "mp4" der Schlefenvarible %%a zuweisen und dann den Teil ausführen, der rechts des Schlüsselwortes DO liegt.


    • "C:\Program Files (x86)\VideoLAN\vlc\vlc.exe"
      Dies ist der erste Teil dessen, was bei jedem Schleifendurchgang ausgeführt wird, der Aufruf des VLC Players. Es ist der genaue Ort, an dem die ausführbare Datei des VLC Players zu finden ist. Das kann von Fall zu Fall verschieden sein. Dies hier ist eben bei mir der Ort, wo unter Win 7 der VLC Player installiert ist.


    • -I dummy -vvv "%%a"
      Wie vorstehend erwähnt, ist der Aufruf des VLC nur ein Teil dessen, was bei jedem Schleifendurchlauf veranlasst wird. Wir wollen ja nicht nur den VLC aufrufen, dafür bräuchten wir keine Script-Datei erstellen, wir wollen dass der VLC aus einer MP4-Datei den Audiostream extrahiert und als MP3-Datei speichert.
      Das muss dem VLC aber "gesagt" werden und dafür gibt es Parameter, die man dem VLC beim Start übergibt. Dies hier sind die ersten beiden Parameter.
      -I dummy (I=Interface) sagt dem VLC, dass er für den Job der zu machen ist, kein Interface benötigt. (Auf diese Option kann verzichtet werden.)
      -vvv (verbose) sagt ihm, dass Dubuggerinformationen ausgegeben werden sollen. (Auf diese Option kann verzichtet werden.)
      "%%a" sagt ihm, dass er für seinen Job die Datei %%a (einschließlich eventeuller Leerzeichen - daher die Einbettung in Anführungszeichen) verwenden soll.Wir erinnern uns, der vollständige Name der jeweils nächsten MP4-Datei wurde in der Schleife der Variable %%a zugewiesen.
    • --sout=#transcode
      Diese und die folgenden beiden Zeilen bilden zusammen den nächsten Parameter, der VLC übergeben wird, die eigentliche Arbeitsanweisung für die Ausführung des Jobs.
      --sout=#transcode sagt dem VLC, dass die über den vorher stehenden Parameter übergebene Datei als transcodierter Stream ausgegeben werden soll (sout=Streamausgabe).


    • {vcodec=none,acodec=mpga,ab=128,channels=2,samplerate=44100}
      Nun folgen in geschweiften Klammern die Informationen zur Transkodierung:
      vcodec=none besagt, dass der Videostream unberücksichtigt bleibt.
      acodec=mpga bedeutet, dass für die Transcodierung des Audiostreams der MPEG-Codec verwendet werden soll. Je nach Ausgangsvideo kann hier auch mp3 eingesetzt werden.
      ab=128 sagt dem VLC, er soll als Audio-Bitrate 128 KB/Sek anwenden.
      Die nächsten beiden Vorgaben "channels" und "samplerate" sind wohl selbsterklärend.
      Auf die Angabe der letzten drei Vorgabewerte kann man in der Regel auch verzichten. Es werden denn die Einstellungen der Ausgangsdatei übernommen. Hier wurde auf die verkürzte Form verzichtet, da dieses Beispiel auch als Vorlage für andere Fälle dienen kann.


    • :std{access=file,mux=raw,dst="%%~na.mp3"}
      :std{} definiert innerhalb der geschweiften Klammern für die Streamausgabe das Streamziel.
      access=file besagt, dass in eine Datei auszugeben ist. (Auf diese Option kann verzichtet werden.)
      mux=raw definiert die zu verwendende Verkapselungsmethode. (Auf diese Option kann verzichtet werden.)
      dst="%%~na.mp3" legt den Namen der Datei fest.
      Auch hier kann man den Code, wenn es sich nur um die Extrahierung einer Audiodatei handelt, kürzer fassen, indem man an Stelle von std direkt file vorgibt. Damit entfällt im Klammerausdruck der Bezug auf "file". Das könnte dann so aussehen:
      :file{dst="%%~na.mp3"}
    • vlc://quit
      Dieser Parameter veranlasst den VLC, sich nach Erledigung des Jobs selbst zu beenden.


    • PAUSE
      Ohne diesen Script-Befehl würde das Terminal-Fenster nach der Auswertung aller Aufträge und Verlassen der FOR-Schleife geschlossen. Um jedoch den Ablauf der Script-Ausführung prüfen zu können, vor allem während eines Testdurchlaufes, wurde dieser Befehl aufgenommen. Damit ist das Terminal vom Anwender zu schließen.
      Wenn man sich sicher ist, dass es keine Probleme mehr gibt, ist dieser Befehl entbehrlich.

    Ein Hinweis zur Schreibweise:
    Die Schlüssel- oder Befehlswörter der Script-Datei wie ECHO, rem, FOR, in, DO oder Pause, können in Groß- oder Kleinbuchstaben geschrieben werden. Hier sind sie wegen der besseren Unterscheidbarkeit gegenüber den Parametern für den Aufruf von VLC in Großbuchstaben geschrieben.


    Weiteres Beispiel


    Wie bereits erwähnt, lassen sich über die Stapelverarbeitung nicht nur Audio-Streams aus einer Video-Datei extrahieren. Ein Anwendungsfall, der immer wieder benötigt wird, ist die Konvertierung eines FLV-Videos zu einem MP4-Video. Wie man dafür obige Scriptdatei ändern muss, soll an folgendem Beispiel gezeigt werden:

    Code
    FOR %%a IN (*.flv) DO "C:\Program Files (x86)\VideoLAN\vlc\vlc.exe" -I dummy %%~na --playlist-autostart --sout=#transcode{vcodec=h264,vb=0,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100} :file{dst="%%~na.mp4"} vlc://quit


    Gegenüber dem ersten Beispiel hat sich hier Folgendes geändert:

    • Die Maske für den Typ der zu konvertierenden Dateien ist nicht mehr "*.mp4" sondern "*.flv",
    • die Codec-Angabe für die Transkodierung des Videostreams ist von "vcodec=none" zu "vcodec=h264,vb=0,scale=1" geändert worden
    • und der Autostart-Modus wird erzwungen.


    Wichtig:

    • Der Autostart-Modus darf nicht deaktiviert sein.
    • Es können nur Dateien berücksichtigt werden, die im selben Verzeichnis wie die Script-Datei liegen.
    • Die Dateinamen(einschließlich Pfad) sollten keine Leerzeichen enthalten.

    Werden Leerzeichen trotz einer Einbettung in Anführungszeichen zum Problem, kann man sie mit dem kleine Tool Space2.jar zu Unterstriche umwandeln. Voraussetzung ist, dass das Java Runtime System auf dem Rechner installiert ist. Das dürfte in den meisten Fällen gegeben sein.


    Nach einem Download muss die Datei von Space2.jar.txt in Space.jar umbenannt werden.





  • Hallo kodela,
    Hier hast Du eine sehr schöne Sammlung von Erfahrungen zu einer sehr guten Zusammenstellung von Anweisungen werden lassen.
    Ich habe die obige mir soeben reingezogen. Dabei gibt es natürlich ein Problem, eine Anleitung für verschiedene Betriebssysteme gültig zu halten.


    Für Windows, was wahrscheinlich einen großen Teil der Nutzer betrifft, gibt es aber spezielle Erleichterungen:
    1. Leerstellen in Dateinamen kann man durch Einrahmung selbiger mit " oder ' umschiffen.
    2. Unzulässige Zeilenumbrüche kann man mit ^ vor dem Zeilenwechsel kupieren.
    So führt z.B. zu Erfolg:


    Code
    for %%a in (*.avi) do cmd /c "C:\program files (x86)\VideoLan\VLC\vlc.exe" ^
    -I dummy -vvv %%a ^
    --sout=#transcode{vcodec=h264,vb=7000,fps=25.000,size=4:3,width=722,height=578,deinterlace,^
    vfilter=croppadd{croptop=2,cropbottom=0,cropleft=2,cropright=0,paddright=0},^
    acodec=mp4a,ab=128,channels=2,samplerate=48000}^
    :standard{access=file,mux=mp4,dst=mp4\%%~na.mp4} ^
    vlc://quit


    Gruß

  • Hallo,

    gibt es ein solchesScript auch fürMac OSX? Das wäre toll. Ich habe nämlich genau dieses Problem, dass ich keinen anderen Weg gefunden habe, um alle Titel einer DVA mp3 CD automatisch zu rippen, anstatt gezwungen zu sein, dies Titel für Titel tun zu müssen. Ein solches Script wäre unheimlich hilfreich.


    Gruß

    • Official Post

    Hallo aguenther,


    Deine Frage wäre im Unterforum "Fragen zum VLC Media Player" besser aufgehoben.

    Bitte bei der nächsten Antwort beachten und dort einen neuen Beitrag erstellen.


    Es gibt für MacOS X ebenso die Möglichkeit mit Kommandozeilenscripten zu arbeiten.

    Dafür füge ich zwei Links ein mit weiterführenden Informationen.


    - https://wiki.videolan.org/Mac_OS_X/

    - https://www.heise.de/mac-and-i/artikel/macOS-Terminal-Das-kleine-Einmaleins-der-Kommandozeile-3463440.html


    MfG

    Thomas