[Batch] Video-Tonspur normalisieren mit mkvmerge und ffmpeg

  • Moin alle zusammen,


    ich würde gerne die Tonspuren einer Serie mit 52 Folgen von der Lautstärke her
    normalisieren und die Folgen mit der neuen Tonspur zusammenfügen alles in einem Arbeitsschritt.


    Ich habe dafür ein Skript gefunden und leicht angepasst. Das Skript arbeitet in drei schritten: Zuerst wird via drag and drop das Video bzw. die Tonspur auf das Skript gezogen und mit dem FFmpeg-Befehl "loudnorm" analysiert, das ergebnis wird in einer Textdatei geschrieben. Anschließend wird die Textdatei ausgewertet und eine neue Tonspur erzeugt. Im weiteren Schritt wird mit mkvmerge die neue Tonspur und das Video zusammengefügt. Die alten Dateien werden anschließend durch das Skript gelöscht, so das am Ende nur noch die verarbeitete Videodatei übrig bleibt.


    Das Skript funktioniert soweit ganz gut, solange es sich nur um eine Videodatei handelt! Bei mehreren Videodateien scheitert es aber, da für jede markierte Videodatei die via drag and drop aufs Skript raufgezogen wird eine Textdatei erzeugt wird bevor das abarbeiten beginnt. Das heißt, bei 52 Folgen analysiert er die erste Folge 52 mal und gibt 52 mal die gleiche Textdatei aus bevor das abarbeiten beginnt und dass wiederholt das Skript bei jeder weiteren Folge.

    Leider komme ich mit meinem Wissen nicht mehr weiter, steh auf dem Schlauch... Wäre dankbar wenn jemand eine Lösung für mein Problem hat. MfG Neugier

  • was mir auffällt ist, dass %1 nicht mit "" eingeklammert wird.

    du hast 2 dateien 'name.video' & 'na me.video'

    dann hast du die variable %1.txt

    die wird im ersten fall ' name.video.txt' konvertiert

    aber im zweiten fall ' "na me.video".txt '

    wie du siehst wird '.txt' nicht mit eingefangen.

    richtig wäre, weil der dateiname potenziell unbekannt ist, durchweg "%~1" zu verwenden.

    das ' ~ ' erzingt eine ""-lose ausgabe, so hat man nicht mit den ständig wechselnden anführungzeichen zu käpfen.

    weiter unten sehe ich, da hat er es richtig gemacht mit "neu\%~n1.mkv"

    ---

    ich muss schauen wie ich zeit finde um das thema voll zu verstehen,

    da meine arbeit mich ziehmlich stark vereinamt.

    und ffmpeg-online wollt ich auch noch fertig basteln... XD

    es würde mir helfen, denn du ein paar kurze videodateien (ca 10sek)

    + dieses skript in ein archiv irgendwo hochlädst.

    dann hätt ich eine vorlage, mit der ich arbeiten kann...

    p.s.: pack alle tools mit rein, die sonnst noch gebraucht werden.

    ---

    edit3:

    dieses script ist für einzeldateien ausgelegt, durch %1 verarbeitet dieses nur die erste datei.

    wie fürst du das script aus, dass es mehrere dateien verabeitet?

    wenn du mein "MultiDropExecuter" verwendest, dann pack das mit ins archiv.

    und sag wie du es verwendest.

  • es würde mir helfen, denn du ein paar kurze videodateien (ca 10sek)

    + dieses skript in ein archiv irgendwo hochlädst. (anonfiles.com)

    dann hätt ich eine vorlage, mit der ich arbeiten kann...

    p.s.: pack alle tools mit rein, die sonnst noch gebraucht werden.

    Bitte sehr, die beiden Skripte mit den Tools: Audio Normalisieren

    dieses script ist für einzeldateien ausgelegt, durch %1 verarbeitet dieses nur die erste datei.

    wie fürst du das script aus, dass es mehrere dateien verabeitet?

    wenn du mein "MultiDropExecuter" verwendest, dann pack das mit ins archiv.

    und sag wie du es verwendest.

    Wie oben geschrieben mache ich das via drag and drop, ziehe die Videodateien auf das
    Skript zum abarbeiten. Richtig, das Skript ist für Einzeldateien ausgelegt, aber es gehen
    auch mehrere, dann gibt es aber Probleme bei der verarbeitung (siehe meinen ersten Beitrag).

    Deinen MultiDropExecuter verwende ich nach 6 jahren immer noch fast täglich :):thumbup:
    Der Code hat die ausländischen Untertitel und Tonspuren in den Videodateien entfernt.
    Damit konnte man einzelne oder auch mehrere Videos verarbeiten mit oder auch ohne Ordner.
    Auch hier lief alles via drag and drop.

    Einmal editiert, zuletzt von Neugier (8. Februar 2023 um 18:31)

  • das script findet bei mir ffmpeg nicht, weil es das verzeichnis wechselt.

    mkvtoolnix wurde in einer variable gesichert.

    ffmpeg nicht.

    werd warscheinlich vieles ändern müssen...

    naja egal.

    muss schaun wie ich zeit finde...

    edit:

    ah jetzt verstehe ich "shift" endlich,

    das würde meine script eskalationen wohl etwas entschärfen können... XD

    edit2:

    fortschritt: es läuft

    und ich weis nicht was ich gemacht habe.

    ich habe es nur auf meine logik leicht angepasst.

    vermutlich war es der input, der nicht vernünftig abgegrenzt wurde

    mit %1 --> "%~1" verursacht keine schäden und macht den input robuster...

    edit3:

    theoretisch könnte ich die prozesse parallel laufen lassen,

    aber bei 10+ dateien würde es die leistung des laufwerks belasten...

    ung gezieltes theading ist (für mich) noch etwas schwierig umzusetzen...

    ok die spielereien mit autodownloader für die tools lass ich mal sein für heute... ;)

  • so bitte schön:

    <anonfiles hat den dienst eingestellt>

    sag ob es irgendwelche probleme gibt.

    dank loop+shift brauchte ich den 'MultiDropExecuter' hier nicht anwenden.

    ordner kann er aber dadurch nicht durchsuchen und verarbeiten...

    aber drag & drop sollte kein problem darstellen.

    der '_tool'-ordner hat eine abhänigkeit mit dem script...

    hier das script für die "KI"-bots...

    ist es gut, dass die von mir lernen...? ^^

    wer sonnst noch was findet... immer her...

    p.s.

    schade das der codeblock nicht ein schriftbild verwendet, wo alle zeichen gleich breit sind,

    wie z.b. "Consolas" oder ähnlichem...

  • sag ob es irgendwelche probleme gibt

    HQ-LQ danke für deine Hilfe! Leider scheitert dein Skript auch bei der verarbeitung von mehreren Videodateien wie mein altes, dein Skript produziert den gleichen Fehler... Wenn ich via drag and drop z.B. 52 Folgen zum abarbeiten aufs Skript ziehe, erstellt er 52 mal die gleiche Textdatei für Folge eins (die erste analysierte Textdatei von loudnorm) bevor das abarbeiten beginnt und das gleiche macht er für jede weitere Folge. Am Ende sind 2704 Textdateien erstellt worden, obwohl es nur 52 sein sollten. Wie du schon sagst, das Skript ist für "Einzeldateien" ausgelegt. Es müsste jede Videodatei einzeln erfassen und behandeln, dann würde es ordnungsgemäß funktionieren.



    Bei 10 Videoclips mit jeweils 10 Sekunden merkt man nicht gleich, dass ohne sichtbare Fehlerausgabe die Textdatei für jedes Video 10 mal erstellt wird. Aber wenn man Videos mit 20 Minuten hat und weiß wie lange die verarbeitung eines Videos dauert, merkt man sofort den Unterschied, dass das Skript nicht richtig funktioniert.

    Fehler: Mehrfache Textausgabe beim alten wie beim neuen Skript
  • also, mit der loop/shift-funktion habe ich gelernt,

    dass troz %1 eingabe mehrere dateien als eingabe abzepiert werden.

    bei mir rannte das script durch, und hat *.ac3 dateien

    und zum schluss einen neuen ordner mit den neuen videos erstellt.

    in welchen pfad befindet sich dein script?

    und wie ist der pfad für deine videos?

    52 dateien habe ich jetzt nicht getestet,

    ich weiß aber, dass windows verschiedene limits hat.

    - eins ab 15 dateien (hat hier keinen einfluss/ getestet)

    - ein anderes ist das zeichenlimit für die komando-eingabe

    müsste aber mal getestet werden.

    gibt es irgenwo sonderzeichen in den dateinamen?

    ---

    pack mal folgendes script in dem selben ordner wie das normalisierungs-script

    und teste mal den drop... bei mir haben 57 dateien funktioniert.

    [shift-test.cmd]


    ---

    edit3:

    ich glaub ich hab was...

  • ok, ich habs...

    es waren wieder die pfade,

    ich habe geschaut, warum der mkvmerge-command nicht gegriffen hat.

    ich hatte einige objekte übersehen...

    auch wurden seltsamerweise, nicht die kompletten befehle kopiert.

    habe ich repariert/ergänzt

    ich habe mir auch die lösch-routienen mir genauer angeschaut...

    ich bin kein fan von ' del *.txt '

    wenn mal die pfade kaputt sind, dann wildert das script sonntwo. :'S

    darum lösche ich überiegend nur mit filtern oder variablen: ' del "%~1.txt" '

    es ist interressant, dass troz ' cd /d "%~dp1" '

    die dateien nicht gefunden wurden,

    das liegt wohl daran, dass der verzeichniswechsel nicht im loop ist, sondern davor...

    das script sollte mit den generierten absoluten pfaden kein verzeichniswechsel mehr benötigen...

    [FF-audio-normalizer.cmd] (fixed)

    so, wenns läuft, dann 3,50...

  • also, mit der loop/shift-funktion habe ich gelernt,

    dass troz %1 eingabe mehrere dateien als eingabe abzepiert werden.

    Punkt 1 : Ja, es werden auch mehrere Videodateien abgearbeitet. Aber es gibt scheinbar ein Problem mit dem Befehl "loudnorm" bzw. die Textdatei die dadurch erzeugt wird. Wie oben schon erwähnt, werden für die Anzahl der markierten Videos die gleichzeitig via drag and drop verarbeitet werden sollen dementsprechend viele Textdateien für die verarbeitung eines einzigen Videos erzeugt, anstatt einer einzigen Textdatei pro Video (Gehirnwirrwarr, ich hoffe du verstehst was ich meine ^^).

    Das Problem ist, dass dein Skript die Textdatei mehrfach überschreibt ohne zufragen. Man sieht es halt nicht als Fehlermeldung oder sonst irgendwo stehen. Bei meinem alten Skript konnte ich es halt nachvollziehen, weil das mehrfache erzeugen der Textdatei im CMD-Fester angezeigt wurde (siehe Screenshot oben in meinem vorletzten Beitrag). Bei deinem Skript wird es im CMD-Fester zwar nicht angezeigt, man kann es aber anhand der Verarbeitungszeit sehen.

    Teste mal ein Folge aus irgendeiner Serie mit mindestens 20 Minuten Laufzeit und schaue wie lange die Verarbeitung dauert. Und dann nimm mehrere Folgen aus der gleichen Serie am besten 15 Folgen und du wirst sehen die Verarbeitung der einzelnen Folgen dauert länger. Und das liegt halt an der erzeugung der Textdatei (siehe Punkt 1).

    Code
    @for             %%i     IN (%*)                         DO  "%xFFmpeg%" -i "%~1" -filter_complex "[0:a]loudnorm=I=-16:TP=-1.5:LRA=11:print_format=summary" -f null x 2> "%~1.txt"

    in welchen pfad befindet sich dein script?

    und wie ist der pfad für deine videos?

    C:\Users\Neugier\Desktop\FF-audio-normalizer
    C:\Users\Tommy Miller\Desktop\Testvideos

    gibt es irgenwo sonderzeichen in den dateinamen?

    Nein, die Videodateien haben keine sonderzeichen.

    pack mal folgendes script in dem selben ordner wie das normalisierungs-script

    und teste mal den drop... bei mir haben 57 dateien funktioniert.

    Habe ich gemacht. Alle Dateien, Tools und Skripte werden erkannt. Aber daran liegt der Fehler auch nicht.

    Edit: [FF-audio-normalizer.cmd] (fixed)

    Funktioniert nicht. Gleiches Problem wie zuvor. Ich denke, jede Videodatei müsste einzeln erfasst und behandeln werden. Mit der loop/shift-funktion wird das alles nicht umsetzbar sein. Der Code vom MultiDropExecuter könnte her halten ?(

    Leider gibt es bis kein vernünftiges Skript was mehrere Tonspuren normalisiert von der Lautstärke und zugleich mit verschiedenen Audioformaten klar kommt. ffmpeg-normalize auf Python-Basis wäre ein Ansatz, kommt aber mit ac3 nicht klar. Sieht echt schlecht aus.

    so, wenns läuft, dann 3,50...

    Würde dir sogar mehr geben :saint: So ein Skript ist Goldwert und fehlt in meiner Sammlung !

    Einmal editiert, zuletzt von Neugier (10. Februar 2023 um 20:54)

  • Zitat

    viele Textdateien für die verarbeitung eines einzigen Videos erzeugt

    ok, es wäre zu klären.

    so für jedes video einzeln die normalisierung laufen?

    so müsste ich für jedes video eine datei erzeugen

    und %* wäre fehl am platz.

    soll aus allen videos die normalisierungs-summe erzeugt werden,

    dann würd es komplizierter, bzw. man müsste den 'shift' rückwärts laufen lassen !?

    wüsste jetzt nicht wie 'shift' reversibel sein sollte.

    ansonnsten müsste man über die script struktur nachdenken

    und die dateien anders zusammenfassen.

    ---

    was genau hatte der script-ersteller vor gehabt? hast du die quelle vom script?

    ---

    da du die viedeos optional einzeln abarbeiten wolltest, so gehe ich von einer einzeldatei lösung aus.

    werds mir nochmal anschauen, jedenfalls ist das %* dann falsch.

    ich muss schauen, was er damit alles einzufangen versucht...

    ---

    ich habe irgendwo ein denkfehler ein denkfehler.

    %* macht in einen loop/shift-schleife keinen sinn,

    im loop nur eine datei repräsentiert wird...

    dann versteh ich das mehrfache überschreiben der selben dateien nicht.

    das sollte so nicht passieren, und damit das script nicht immer langsamer werden.

    jeder loop/shift prozess sollte in sich abgekapselt werden...

  • ok, es wäre zu klären.

    so für jedes video einzeln die normalisierung laufen?

    da du die viedeos optional einzeln abarbeiten wolltest, so gehe ich von einer einzeldatei lösung aus.



    Genau, das war mein Plan.

    was genau hatte der script-ersteller vor gehabt? hast du die quelle vom script?

    Von hier habe ich das Skript - ffmpeg loudnorm 2pass in single line

    4 Mal editiert, zuletzt von Neugier (10. Februar 2023 um 21:56)

  • also ich glaube ich hab ein bug entdekt.

    1# %* in einem :loop/shift macht keinen sinn, wenn der input im loop nur eine datei ist.

    2# merkwürdigerweise wird dieser for-befehl, nach der anzahl der übergebenen dateien, mehrfach ausgeführt.

    d.h. lasse ich 10 dateien fallen, dann steht der befehl 10x da, obwohl nur ein dateiname gespeichert ist.

    ich hab das mit ' echo ' & ' pause ' ermittelt.

    also, mit ' pause ' hab ich das script und den loop sofort unterbrochen,

    er hätte eigendlich nicht mal die chance gehabt bis 10 zu zählen...

    ich wüsste nicht, warum %* überhaupt solche methainformation haben soll.

    egal, da nur eine einzeldatei-verarbeitung gewünscht ist,

    so werde ich das rausschmeißen, die for-schleife macht keinen sinn,

    zumal die variable %%i auch nicht weiter verwendet wird...

    kannst ja dann mal sagen ob es dann gewünscht funktioniert...

  • done...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!