x264.exe aus Java aufrufen - wie mit Pause bei Fehler?

  • Hi,

    wenn ich die x264 exe starte und die parameter per verknüpfung übergebe, verschwindet sie sofort wenn ein fehler auftritt, sodass ich nicht sehen kann was falsch ist. Was muss ich in der Verknüpfung, x264.exe als parameter übergeben damit das nicht mehr passiert? /k brachte nichts. Die Verknüpfung zur exe wird mit Java aufgerufen. Auslesen der Meldungen per InpuStream geben leider immer null zurück.

  • In Java hab ich es mit:
    try{
    Process p=Runtime.getRuntime().exec("cmd /k start "+pfad+" "+parameter+" "+ziel+" "+quelle);
    dann:
    try{
    p.waitFor();}
    catch(InterruptedException ie){};
    System.out.println( "Rückgabewert: " + p.exitValue());

    oder:
    final InputStream processOutput = p.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader( processOutput));
    String line;
    while ((line = br.readLine()) != null) {
    System.out.println(line);
    }

    oder:


    BufferedReader in = new BufferedReader (
    new InputStreamReader (p.getInputStream()) );
    int ch;
    while( (ch = in.read()) != -1 ) {
    System.out.println(ch);
    }


    oder:
    Scanner s = new Scanner( p.getInputStream());
    while (s.hasNext()) System.out.println(s.nextLine());
    Scanner d = new Scanner( p.getErrorStream());
    while (d.hasNext()) System.out.println(d.nextLine());
    versuhct leifert aber alles null zurück

  • Eine frage: Wofür brauchst du das cmd /k start am Anfang?
    Solang du keine Shell-Befehle ausführen willst, ist das ziemlich überflüssig und du handelst dir unnötig eine Abhängigkeit von "cmd.exe" ein.

    Außerdem sollte man Pfadangaben immer schön braf in Anführungszeichen packen, da sie Leerzeichen enthalten könnten!
    Also "irgendwas \"" + pfad + "\" irgendwas" anstatt "irgendwas " + pfad + " irgendwas".

    Ich würde es also so versuchen:

    Zitat

    Process p=Runtime.getRuntime().exec("\" + pfad + "\" " + parameter + " \"" + ziel + "\" \"" + quelle + "\"");

    Wenn unbedingt mit cmd.exe dann ist es glaub ich so richtig:

    Zitat

    Process p=Runtime.getRuntime().exec("cmd.exe /k \"start \"" + pfad + "\" " + parameter + " \"" + ziel + "\" \"" + quelle + "\"\"");

    (Man muss für cmd.exe also alles, was nach dem /k kommt nochmals in Anführungszeichen packen, auch wenn der Befehl selbst wiedrum Anführungszeichen enthält)

  • Brauch ich denn dei "\" für pfad angaben wenn er den Pfad per Fileinput ausliest?
    int der var ziel habe ich "ziel.mkv" stehen, in paramter "-- qp 16 --bframes" etc. und in quelle und pfad halt den Wert den Fileinput zurückliefert also zb. "C:\Users\****\Desktop\Projektordner\x264.exe". Werd aber mal versuchen. Das mit cmd hab ich da stehen weil ich gelesen hatte das er das braucht um die parameter zu verarbeiten. Klappt auch solange kein Fehler auftritt.

    Werd die tipps nachher mal ausprobieren thx.

  • Wenn Pfadnamen Leerzeichen enthalten - auch wenn dies nur möglicherweise der Fall ist - muss man sie in Anführungszeichen setzen. Das gilt sowohl für den Pfad zu deiner x264.exe, als auch für die Pfade die du an x264 übergibst. Du solltest deshalb schon darauf achten alle Pfade in Anführungszeichen zu setzen, sonst sind Probleme vorprogrammiert!

    Beispiel:

    Zitat

    "C:\Users\Hans Wurst\Desktop\Projektordner\x264.exe" --qp16 --brframe --output "C:\Users\Hans Wurst\Desktop\Projektordner\Ziel.mkv" "C:\Users\Hans Wurst\Desktop\Projektordner\Quelle.avs"

    Macht als Java String mit korrekt maskierten Anführungszeichen dann:

    Zitat

    String cmdln = "\"C:\\Users\\Hans Wurst\\Desktop\\Projektordner\\x264.exe\" --qp16 --brframe --output \"C:\\Users\\Hans Wurst\\Desktop\\Projektordner\\Ziel.mkv\" \"C:\\Users\\Hans Wurst\\Desktop\\Projektordner\\Quelle.avs\"";

    Natürlich werden die Pfade in deinem fertigen Programm nicht "hardcoded" sein :zunge:


    Und wenn du mit cmd.exe arbeitest, was man zur Parameter-Übergabe sicher NICHT braucht, dann muss NOCHMAL der gesamte Befehl in Anführungszeichen also:

    Zitat

    cmd.exe /k ""C:\Users\Hans Wurst\Desktop\Projektordner\x264.exe" --qp16 --brframe --output "C:\Users\Hans Wurst\Desktop\Projektordner\Ziel.mkv" "C:\Users\Hans Wurst\Desktop\Projektordner\Quelle.avs""

    Den Java String spar ich mir mal an dieser Stelle ;)

  • Ich hab es mit den "\" ausprobiert klappte aber leider nicht. Ohne cmd fürht er erst gar nicht die exe aus. Man bruacht scheinbar "cmd start".

    Mit Selurs tip kommt Als Ausgabe:

    java.io.FileInputStream@40afb9
    java.io.FileInputStream@a415a3
    java.io.FileInputStream@1c67248
    java.io.FileInputStream@e2433b
    java.io.FileInputStream@2d0479
    java.io.FileInputStream@694f12
    java.io.FileInputStream@b0ede5
    java.io.FileInputStream@1304043
    java.io.FileInputStream@1758cd1
    java.io.FileInputStream@e555bd
    java.io.FileInputStream@16f5261
    java.io.FileInputStream@1554233
    java.io.FileInputStream@1080876
    java.io.FileInputStream@ba6c13
    java.io.FileInputStream@1c6d11a
    java.io.FileInputStream@1b5a5cf
    java.io.FileInputStream@8c7be5
    java.io.FileInputStream@1f8d244
    java.io.FileInputStream@14b081b


    Code:

    try{
    Process application = Runtime.getRuntime().exec("cmd /k start "+pfad+" "+parameter+" "+ziel+" "+quelle);

    StringBuffer inBuffer = new StringBuffer();
    InputStream inStream = application.getInputStream();
    new InputStreamHandler( inBuffer, inStream );
    StringBuffer errBuffer = new StringBuffer();
    InputStream errStream = application.getErrorStream();
    new InputStreamHandler( errBuffer , errStream );
    System.out.println(errStream);
    try{
    application.waitFor();}
    catch(Exception e){};

    Mit den von dir im letzen Post geändertetn zeichen gibts ein illeagel character \92 error

    Einmal editiert, zuletzt von sasuke9999 (27. Oktober 2008 um 17:13)

  • Ich hab es mit den "\" ausprobiert klappte aber leider nicht. Ohne cmd fürht er erst gar nicht die exe aus. Man bruacht scheinbar "cmd start".

    Nö, das kannst du mir ruhig glauben. Ich hab schon das ein oder andere front-end gebastelt :D

    Korrekt wäre meiner Meinung nach außerdem:

    Zitat

    Process application = Runtime.getRuntime().exec("cmd /k \"start \"" + pfad + "\" " + parameter + " \"" + ziel + "\" \"" + quelle + "\"\"");

    Oder eben einfacher:

    Zitat

    Process application = Runtime.getRuntime().exec("\"" + pfad + "\" " + parameter + " \"" + ziel + "\" \"" + quelle + "\"");

    Vlleicht lässt du dir die von deinem Programm generierte Kommandozeile mal von Java auf der Console ausgeben, um sie dann von Hand in der Command Shell zu testen...

  • Klappt bei mir 1a, wenn ich es so mache :cool:

    Code
    public class Test {	public static void main(String[] args) throws IOException {		String pfad = "C:\\Program Files (x86)\\MPlayer for Windows\\MPlayer.exe";		String parameter = "-framedrop -vo gl";		String ziel = "F:\\ViDeOz\\Music\\Soulfly - Back To The Primitive (Live @ Area4 Festival 2008).avi";		Process application = Runtime.getRuntime().exec("\"" + pfad + "\" " + parameter + " \"" + ziel + "\"");		try {			application.getInputStream().close();			application.getOutputStream().close();			application.getErrorStream().close();			application.waitFor();		} catch (InterruptedException e) {			e.printStackTrace();		}		System.out.println("Exit Code: " + application.exitValue());	}}


    Alternativ auch mit deiner heiß geliebten cmd.exe ;)

  • Noch etwas übersichtlicher ist es vllt so :D


    Hm bei mir gehts damit auch nicht.

    Exit Code: -1
    wird ausgegeben und x264.exe wird nicht gestartet.

    Wäre nun interessant, was x264 zu bemängeln hat :rolleyes:

    Deshalb: Lass dir die von deinem Programm generierte Commadline ausgeben und starte sie manuell in der Eingabeaufforderung...

  • So, hier das komplette Programm mit Weiterleitung von Stdout/Stderr in separaten threads:


    Viel Spass damit ;)

  • *gig* wirkt ein bissel wie der Anfang eines sx264 in Java :) (hatte Anfangs auch überlegt Java zu nehmen, wollte dann aber wieder meine C++ Kenntnisse etwas auffrischen und mich deshalb gegen Java entschieden).
    Viel Spaß wenn Du dazu noch einen BitrateCalculator schreibst,... Overheadberechnungen sind ein echter Killer. *gig*

  • Supi. Jetzt gibt er was aus


    STDOUT:
    STDOUT: C:\Users\***\Desktop\testx264>
    STDERR: x264 [error]: invalid argument: qp = p


    ^^. jetzt muss ich es nur noch bei mir übernehmen thx.

  • Supi. Jetzt gibt er was aus


    STDOUT:
    STDOUT: C:\Users\***\Desktop\testx264>
    STDERR: x264 [error]: invalid argument: qp = p

    :ani_lol: :zunge:


    Übrigens kannst du

    Zitat

    application = Runtime.getRuntime().exec("cmd.exe /k \"" + cmdln + "\"");


    durch

    Zitat

    application = Runtime.getRuntime().exec(cmdln);


    ersetzen und es wird immer noch tun ;)

Jetzt mitmachen!

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