ffmpeg Hilfe: Batch Remux Video + Extract Audio

  • Hi Leute,


    bin recht unbeholfen was ffmpeg angeht, wollte mich aber mal daran versuchen um folgendes zu erreichen:
    Mit OBS aufgenommene Videos (nvenc/h2.64 + 2x AAC audio spuren) den Ton extrahieren und den video stream von *.mkv in *.mp4 remuxen.
    Warum ? Ton = Nachbearbeitung / Video = Zwar kann TMPGenc die *.mkv spur einlesen - jedoch ist die (jeweils mit geringeren CQP) arg schwer zu spulen.
    Ja, OBS selbst kann schon mkv in mp4 remuxen, aber kein batch soweit ich das sehe (mal vom Ton extrahieren abgesehen).


    Bin noch bis heute Abend unterwegs, wollte aber schonmal fragen ob das hier in die richtige Richtung geht:


    -map 0
    for %%a in ("*.mkv") do ffmpeg -i "%%a" -vn -acodec copy "newfiles\%%~na.aac"
    for %%a in ("*.mkv") do ffmpeg -i "%%a" -vcodec copy -an "newfiles\%%~na.mp4"
    pause



    Sollte das grundsätzlich funktionieren um alle *.mkv im ordner der *.bat file zu ergreifen und den 1. Ton extrahieren 2. Video remuxen ?
    Über Tipps und elegantere Ansätze würde ich mich immer freuen :D Danke euch!

  • Hallo,


    ich habe nicht genau verstanden was du machen willst?
    Die erste Tonspur extrahieren und den Videostream als mp4 muxen?


    Ich mache es mal für ein Video:



    Bash
    ffmpeg -i input.mkv -map 0:0 -c copy -movflags +faststart out.mp4
    ffmpeg -i input.mkv -map 0:1 -c copy out.aac

    das würde dann nur das video im mp4 conatiner enthalten und du hättest den ersten audiotrack als aac


    die streams werden dabei nur kopiert

  • Heyo,


    Videostream als mp4 muxen - ja. Aber beide Tonspuren extrahieren. Wie sähe das mapping command dann aus ?


    Genau, will auch nur das copy (kopieren) zum reinen remuxen / extrahieren.


    EDIT
    Nehme ich richtig an das "-movflags +faststart" der Spulbarkeit hilft da die metadate an den Anfang geschrieben werden ?

  • du nutzt einfach -map


    -map 0:0 == 1. Stream (video)
    -map 0:1 == 2. Stream (1. audio spur)
    -map 0:2 == 3. Stream (2. audio spur)
    usw


    die führende null ist einfach der erste input


    also
    -i file1.mkv -i file2.mkv -map 0:0 -map 1:1 -c out.mp4


    würde dann zB den video stream von file1 und den audio stream von file2 muxen

  • So, bin jetzt auf folgenden Befehl raus:



    Code
    for %%a in ("*.mkv") do ffmpeg -i "%%a" -map 0:0 -c copy -movflags +faststart "%%~na.mp4"
    for %%a in ("*.mkv") do ffmpeg -i "%%a" -map 0:1 -c copy "Track1%%~na.aac"
    for %%a in ("*.mkv") do ffmpeg -i "%%a" -map 0:2 -c copy "Track2%%~na.aac"
    pause

    Der macht folgendes:
    1. Videostream aus jeder MKV datei im ausgeführten Ordner in eine neue MP4 datei muxen (Name bleibt dabei gleich - nur andere container endung).
    2. Den AAC Ton aus der MKV in jeweils Track 1 und Track 2 extrahieren.


    Läuft super! Jetzt spare ich mir das Remuxen aus OBS und muss danach auch nicht noch extra mkvextract nehmen!


    Danke @Schauerland für das erklären der mapping Funktion.

  • das -movflags +faststart bewirkt übrigens bei mp4, dass der index an den Anfang der Datei geschrieben wird in einem 2. pass.


    das dauert etwas länger aber dafür kann die Datei schneller eingelesen werden später.
    Du musst das also nicht zwingen mit reinnehmen - ich würde es aber empfehlen.


    Du kannst das auch in einem loop machen:


    Code
    for %%i in (".\*.mkv") do (
    ffmpeg -i "%%i" -map 0:0 -c copy -movflags +faststart "%%~ni.mp4"
    ffmpeg -i "%%i" -map 0:1 -c copy "Track1%%~ni.aac"
    ffmpeg -i "%%i" -map 0:2 -c copy "Track2%%~ni.aac"
    )

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!