# Runtime exec und mplayer (linux)



## lordcarlos (11. Mai 2009)

Guten Tag liebes Java-forum.
Ich bin der neue 

Ich versuche den video player, mplyer, mit meinem Java Programm zu starten, aber da läuft was schief wenn ich Daten mit einem Leerzeichen öffnen will.

Folgendes Beispiel funktioniert:

```
Runtime rt = Runtime.getRuntime();
String befehl = "/usr/bin/mplayer /home/carlos/downloads/benny.mkv &";  //debug
System.out.println(befehl);  //debug
rt.exec(befehl); //video starten
```

Aber wie spiele ich jetzt Filme mit Leerzeichen im Namen ab?
Habe auch schon ein wenig erfolglos getestet.

```
String befehl = "/usr/bin/mplayer /home/carlos/downloads/Alex\\ Gaudino\\ -\\ Destination\\ Calabria.mkv &";
```


```
String befehl = "/usr/bin/mplayer '/home/carlos/downloads/Alex Gaudino - Destination Calabria.mkv' &";
```

Die Zeile dir mir _System.out.println(befehl);_ gibt lässt sich Problemlos in der Konsole ausführen. Die Datei ist also vorhanden.
Ich würde jetzt gerne noch eine Fehlermeldung posten, aber Runtime unterdrückt ja den ganzen output von mplayer. 

Mfg Lord-carlos


----------



## Wildcard (11. Mai 2009)

Nimm das hier:
ProcessBuilder (Java Platform SE 6)
Jedes Argument ist dann ein Array Eintrag und quoting passiert automatisch.


----------



## lordcarlos (11. Mai 2009)

danke für die schnelle Antwort!


```
ProcessBuilder process = new ProcessBuilder();
process.command(befehl);
```

Das geht mit keinem der drei _befehl_ Möglichkeiten.

Ich habe auch mal folgendes getestet:

```
Process process = new ProcessBuilder(befehl).start();
```
Geht auch nicht aber ich bekomme ein fehler.


```
SCHWERWIEGEND: null
java.io.IOException: Cannot run program "/usr/bin/mplayer /home/carlos/downloads/benny.mkv &": java.io.IOException: error=2, No such file or directory
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:474)
        at pronsort.Main.main(Main.java:42)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
        at java.lang.ProcessImpl.start(ProcessImpl.java:81)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:467)
        ... 1 more
```
Was aber komisch ist, weil die file ist da und der Befehl vom sout immer noch funktioniert.


----------



## Wildcard (11. Mai 2009)

```
command("/usr/bin/mplayer", "/home/carlos/downloads/benny.mkv");
```


----------



## lordcarlos (11. Mai 2009)

Danke, das geht leider auch nicht. mplayer wird gar nicht erst gestartet.
Kann ich dem ProcessBuilder das er eine Fehlermeldung ausgeben soll?


----------



## Wildcard (11. Mai 2009)

Das Process Objekt hat einen ErrorStream und einen OutputStream. Beide solltest du lesen und ausgeben (oder mit redirectErrorStream beide in den OutputStream laufen lassen und nur diesen lesen).


----------



## lordcarlos (11. Mai 2009)

ah, .start() vergessen.

```
ProcessBuilder process = new ProcessBuilder();
process.command("/usr/bin/mplayer", "/home/carlos/downloads/benny.mkv").start();
```
Jetzt geht wenigsten das benny video wieder. Die anderen gehen immer noch nicht. Ich werde mal weiter fummeln.


----------



## Wildcard (11. Mai 2009)

lordcarlos hat gesagt.:


> Die anderen gehen immer noch nicht. Ich werde mal weiter fummeln.


Ohne Fehlerbeschreibung kann ich da nicht helfen.


----------



## lordcarlos (11. Mai 2009)

Ich habe jetzt ein wenig umgestellt, und auch ein guten code als Vorlage gefunden:
http://www.avpresentations.com/code/java_mplayer_control_example.txt

```
static InputStream is;
    static OutputStream os;
    static InputStreamReader isr;
    static OutputStreamWriter osw;
    static BufferedReader br;
    static BufferedWriter bw;
    static PrintWriter pw;
    static Process process;
```
etc.


```
String datei = "/home/carlos/downloads/Alex\\ Gaudino\\ -\\ Destination\\ Calabria.mkv";
                String datei2 = "/'/home/carlos/downloads/Alex Gaudino - Destination Calabria.mkv";
                String datei3 = "/home/carlos/downloads/benny.mkv";
                //rt.exec(befehl); //video starten
                
                //ProcessBuilder process = new ProcessBuilder();
                //process.command("/usr/bin/mplayer", datei3).start();
                
                process = new ProcessBuilder("/usr/bin/mplayer", datei2).start();
                
                is = process.getInputStream();
                os = process.getOutputStream();
                isr = new InputStreamReader(is);
                osw = new OutputStreamWriter(os);
                br = new BufferedReader(isr);
                bw = new BufferedWriter(osw);
                pw = new PrintWriter(bw);
                String line;

                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
```

und jetzt guck dir doch mal den output an -.-


```
MPlayer dev-SVN-r29170129 audio & 259 video codecs

Playing /'/home/carlos/downloads/Alex Gaudino - Destination Calabria.mkv.


Exiting... (End of file)
```

Was soll das denn jetzt? ;(


----------



## Wildcard (11. Mai 2009)

Was soll das denn sein?
/'/home/carlos/downloads/Alex Gaudino

/'?


----------



## lordcarlos (11. Mai 2009)

Huch? Wie ist das denn darein gekommen? Das tut mir leid, habe ich wohl übersehen.
nach ein wenig googeln habe ich auch das hier gefunden. Leerzeichen in cmd eingabe - Java @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe


```
String[] play = {"/usr/bin/mplayer", "/home/carlos/downloads/Alex Gaudino - Destination Calabria.mkv"};
process = new ProcessBuilder(play).start();
```

Das geht erste Sahne. :toll:

Danke an deine Hilfe! Nettes forum, weiter so.

Mfg Lord-carlos


----------



## Wildcard (11. Mai 2009)

lordcarlos hat gesagt.:


> nach ein wenig googeln habe ich auch das hier gefunden. Leerzeichen in cmd eingabe - Java @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe


Jetzt erzähl mir aber nicht, das ich dir das nicht schon von anfang an erzählt habe


----------

