mkvmerge mit Variablen verwenden

  • Hallo zusammen,

    ich bin Anfänger und habe schon stundenlang im Forum gelesen. Nun habe ich mich an mein erstes Scipt
    gewagt und es klappt auch alles bis auf ein Problem, wo ich nicht weiterkomme.

    Das Scipt soll mit hilfe von mkvmerge in einer Schleife mehrere Videos muxen. Die Rohdaten liegen in
    2 Verzeichnissen.

    • *.264
    • *.mp2


    Mein Ansatz war, die Dateien im 1. Verzeichnis in ein Array zu lesen und so aufzubereiten, dass der komplette
    Dateipfad in einer Varablen steht.
    Als nächstes wird geprüft, ob der Dateiname (nun mit Endung .mp2) im 2. Verzeichnis existiert und wenn ja
    ebenfalls in einer Variablen gespeichert.
    Danach soll das Muxen erfolgen.

    mein bisheriger Quellcode:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $arrFileList = _FileListToArray("F:\a", "*.264")
    If @error = 1 Then
    MsgBox(0, "", "Verzeichnis nicht gefunden!")
    Exit
    EndIf
    If @error = 4 Then
    MsgBox(0, "", "Datei nicht gefunden")
    Exit
    EndIf
    ;~ _ArrayDisplay($arrFileList, "$FileList") - Debug: ob Dateien eingelesen werden

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ eingelesene Dateien von $arrFileList in Bestandteile splitten
    ;~ prüfen, ob die dazugehörige mp2-Datei existiert und mkvmerge ausführen
    Local $szDrive, $szDir, $szFName, $szExt
    Local $arrDateiPath = _PathSplit("F:\a\" & $arrFileList[1], $szDrive, $szDir, $szFName, $szExt)
    ;~ _ArrayDisplay($TestPath, "Demo _PathSplit()") - Debug: ob Dateien eingelesen werden

    [/autoit] [autoit][/autoit] [autoit]

    Local $Datei_mkv = "F:\a\" & $szFName & ".mkv"
    Local $Datei_mkv2 = '"'& $Datei_mkv & '"'
    Local $Datei_264 = "F:\a\" & $szFName & ".264"
    Local $Datei_2642 = '"'& $Datei_264 & '"'
    Local $Datei_mp2 = "F:\b\" & $szFName & ".mp2"
    Local $Datei_mp22 = '"'& $Datei_mp2 & '"'
    ;~ MsgBox(0, "", $Datei_mkv2)

    [/autoit] [autoit][/autoit] [autoit]

    If FileExists($Datei_mp2) Then
    RunWait(@ComSpec & ' /k mkvmerge.exe -o $Datei_mkv2 $Datei_2642 $Datei_mp22 ', 'C:\mkvToolNix\')
    EndIf

    [/autoit]

    Leider werden die Variablen nicht umgesetzt.

    Wenn ich z.B. folgendes verwende, funktioniert es ohne Probleme:

    [autoit]


    RunWait(@ComSpec & ' /k mkvmerge.exe -o "F:\a\Test.mkv" "F:\a\Test.264" "F:\b\Test.mp2"', 'C:\mkvToolNix\')

    [/autoit]

    Vermutlich ist es einfach nur eine Kleinigkeit, aber ich finde die Lösung einfach nicht.
    Ich hoffe, mir kann jemand helfen.

    Danke im Voraus
    René

    ;)

    Einmal editiert, zuletzt von PCMader (16. November 2012 um 15:48)

  • Du musst dir deinen gewünschten String mit Hilfe de & Prmeters zusammenketten. Und wenn es alle Dateien sein sollen, benötogst du ntürloch auch eine Schleife. Versuch es einmal so:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $arrFileList = _FileListToArray("F:\a", "*.264")
    If @error = 1 Then
    MsgBox(0, "", "Verzeichnis nicht gefunden!")
    Exit
    EndIf
    If @error = 4 Then
    MsgBox(0, "", "Datei nicht gefunden")
    Exit
    EndIf
    ;~ _ArrayDisplay($arrFileList, "$FileList") - Debug: ob Dateien eingelesen werden

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $arrFileList[0]
    ;~ eingelesene Dateien von $arrFileList in Bestandteile splitten
    ;~ prüfen, ob die dazugehörige mp2-Datei existiert und mkvmerge ausführen
    Local $szDrive, $szDir, $szFName, $szExt
    Local $arrDateiPath = _PathSplit("F:\a\" & $arrFileList[$i], $szDrive, $szDir, $szFName, $szExt)
    ;~ _ArrayDisplay($TestPath, "Demo _PathSplit()") - Debug: ob Dateien eingelesen werden

    [/autoit] [autoit][/autoit] [autoit]

    Local $Datei_mkv = "F:\a\" & $szFName & ".mkv"
    Local $Datei_mkv2 = '"' & $Datei_mkv & '"'
    Local $Datei_264 = "F:\a\" & $szFName & ".264"
    Local $Datei_2642 = '"' & $Datei_264 & '"'
    Local $Datei_mp2 = "F:\b\" & $szFName & ".mp2"
    Local $Datei_mp22 = '"' & $Datei_mp2 & '"'
    ;~ MsgBox(0, "", $Datei_mkv2)

    [/autoit] [autoit][/autoit] [autoit]

    If FileExists($Datei_mp2) Then
    $sCommand = 'mkvmerge.exe -o "' & $Datei_mkv2 & ' ' & $Datei_2642 & ' ' & $Datei_mp22 & '"'
    ConsoleWrite($sCommand & @CRLF)
    RunWait($sCommand, 'C:\mkvToolNix\')
    EndIf
    Next

    [/autoit]

    mfg autoBert

  • Hallo autoBert,

    danke für die schnelle Antwort. Leider hatte ich damit immer noch keinen Erfolg.

    [autoit]

    3
    $sCommand = 'mkvmerge.exe -o "' & $Datei_mkv2 & ' ' & $Datei_2642 & ' ' & $Datei_mp22 & '"'
    ConsoleWrite($sCommand & @CRLF)

    [/autoit]

    Deute ich es richtig, dass consoleWrite den Sting nur in das Consolefenster schreibt. Muss die Console
    dazu nicht vorher offen sein. Wenn, dann fehlt doch im String noch die komplette Pfadangabe zu
    mkvmerge - oder nicht?

    zu der Anweisung:

    [autoit]


    RunWait($sCommand, 'C:\mkvToolNix\')

    [/autoit]

    habe ich auch noch Frage:
    Fehlt hier nicht des Makro @ComSpec?

    Ich habe Deine Version bei mir eingebaut. Allerding öffnet sich nicht das Consolen-Fenster
    und das Video wird auch nicht gemuxt.

    Hinweis: ich arbeite mit Win7_x64 - falls das wichtig sein sollte.

    Danke und Gruß
    René

  • Hallo Friesel,

    danke für die Anwort. Habe jetzt allerdings wenig Zeit, mich
    ausführlich damit zu befassen. Auch bin ich noch ziemlich
    umbeleckt bezüglich AutoIt.

    Aber auf dem 1. Blick vermute ich, dass nur die Pfadzusammenstellung
    erleichtert wird.?!
    Hilft mir die au3 auch bei dem mkvmerge-Problem?

    Gruß
    René

    :?:

  • Problem gelöst!!

    Hallo alle Zusammen,

    ich konnte das Problem mit Hilfe der Idee von autoBert lösen.

    Hier für alle, welche auch ein ähliches Problem haben, der erweiterte Code:

    [autoit]


    $sCommand = ' /c mkvmerge.exe -o ' & $Datei_mkv2 & ' ' & $Datei_2642 & ' ' & $Datei_mp22
    ;~ ConsoleWrite($sCommand & @CRLF)
    RunWait(@ComSpec & $sCommand, 'C:\mkvToolNix\')

    [/autoit]

    Der consoleWrite - Befehl wird nicht benötigt.

    Danke noch einmal autoBert für die Idee, den String vorher zusammenzustellen.
    Danke auch Friesel. Ich werde mir das au3 anschauen um eventuell den Code
    zu vereinfachen.

    Gruß
    René

    PS: Wie kann ich den Beitrag schließen? Suche schon wie ein Verrückter - bin aber leider blind.

    :thumbup:

    Einmal editiert, zuletzt von PCMader (16. November 2012 um 13:34)

  • Deute ich es richtig, dass consoleWrite den Sting nur in das Consolefenster schreibt. Muss die Console
    dazu nicht vorher offen sein.


    Stimmt es gibt den zusammengesetzten String in der Scitekonsole aus. Sollte dies nicht offen sein kannst du sie mit F8 öffnen. Die Ausgabe dient zur Kontrolle.

    Fehlt hier nicht des Makro @ComSpec?

    Das Makro wird nur benötigt wenn interne Befehle des Kommndozeileninterpreters benutzt werden, da mkvmerge.exe aber ein eigenständiges Programm ist kann es weggelassen werden.

    Edit: du solltest das Thema noch auf gelöst stellen: 1. Beitrg bearbeiten Präfix (nähe Überschrift) umstellen und absenden.

    mfg autoBert

  • Problem gelöst!!

    Hallo alle Zusammen,

    ich konnte das Problem mit Hilfe der Idee von autoBert lösen.

    Hier für alle, welche auch ein ähliches Problem haben, der erweiterte Code:

    [autoit]


    $sCommand = ' /c mkvmerge.exe -o ' & $Datei_mkv2 & ' ' & $Datei_2642 & ' ' & $Datei_mp22
    ;~ ConsoleWrite($sCommand & @CRLF)
    RunWait(@ComSpec & $sCommand, 'C:\mkvToolNix\')

    [/autoit]

    Das wird aber teilweise zu Problemen führen, immer dann wenn sich Leerzeichen in einem der Pfade / Dateinamen befinden. Besser wäre es die Parameter sauber mit Anführungszeichen zu trennen:


    [autoit][/autoit][autoit][/autoit][autoit]

    $MKVmergePath = "c:\mkvToolNix 5.1\mkvmerge.exe" ; Pfad mit Leerzeichen ;)

    [/autoit][autoit][/autoit][autoit]

    $sCommand = '"' & $MKVmergePath & '" -o "' & $Datei_mkv2 & '" "' & $Datei_2642 & '" "' & $Datei_mp22 & '"'
    ;~ ConsoleWrite($sCommand & @CRLF)
    RunWait($sCommand)

    [/autoit]