2010-02-18 6 views
5

Ich habe diesen Thread bereits gesehen, aber ich habe immer noch ein Problem: starting vlc player in java Es scheint, die Java-Bindungen für VLC sind nicht mehr aktiv entwickelt und unterstützen nicht alles in der Befehlszeile sowieso möglich.Starten Sie VLC in Java und verbinden Sie es über RC-Schnittstelle

Mit dem folgenden Code kann ich VLC nicht aus einer Java-Anwendung auf Mac OS 10.5.8 (Java 1.6) starten und dann über die RC-Schnittstelle über das Terminal oder eine andere Java-Anwendung eine Verbindung zu ihm herstellen.

public class Main { 

public static void main(String[] args) { 
    String s = null; 


    try { 
     //Process p = Runtime.getRuntime().exec("/Applications/VLC.app/Contents/MacOS/VLC -I telnet --telnet-host=localhost:4442 -I rc --rc-host=localhost:4444"); 
     //Process p = Runtime.getRuntime().exec("/Applications/VLC.app/Contents/MacOS/VLC -I rc --rc-host=localhost:4444"); 

     //ProcessBuilder pb = new ProcessBuilder("/Applications/VLC.app/Contents/MacOS/VLC","-I rc","--rc-host=localhost:4444"); 
     ProcessBuilder pb = new ProcessBuilder("/Applications/VLC.app/Contents/MacOS/VLC","-IRC","--rc-host=localhost:4444"); 
     Process p = pb.start(); 

     StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), false); 
     StreamGobbler inputGobbler = new StreamGobbler(p.getInputStream(), false); 
     errorGobbler.start(); 
     inputGobbler.start(); 

     System.out.println("Waiting: \n"+p.waitFor());  
     System.out.println("All done here"); 
     //p.destroy(); 
     //System.exit(0); 

    } catch (IOException ioe) { 
    ioe.printStackTrace(); 
    } catch (Exception ie) { 
    ie.printStackTrace(); 
    } 
} 
} 

class StreamGobbler extends Thread { 
InputStream is; 
boolean discard; 
StreamGobbler(InputStream is, boolean discard) { 
    this.is = is; 
    this.discard = discard; 
} 
public void run() { 
try { 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String line=null; 
    while ((line = br.readLine()) != null) 
    if(!discard) 
     System.out.println(line);  
    } 
catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 

} }

Hier ist die Java-Anwendung, die Apache Commons Net-Paket verwenden, das ich versuche, auf die obige App zu verbinden, die auf der gleichen Maschine laufen:

public class TelnetTest { 
public static void main(String args[]) { 


    TelnetClient tl = new TelnetClient(); 
    try { 
     tl.connect("localhost", 4444); 
     if(tl.isConnected()) { 
      System.out.println("Connected successfully!"); 

      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(tl.getOutputStream())); 
      bw.write("quit"); 
      bw.flush(); 

     } else { 
      System.err.println("Problem with connection"); 
     } 
    } catch(Exception e) { 
     System.err.println("Telnet connection threw an exception: "+e.getMessage()); 
    } 
} 
} 

Die Letztere App funktioniert gut, wenn ich VLC mit den Befehlen der ersten App im Terminal starte. Ebenso kann ich keine Verbindung zur ersten App vom Terminal herstellen, indem ich "telnet localhost 4444" im Terminal verwende.

Der einzige Unterschied, den ich finden kann, ist in der Ausgabe von VLC. Wenn im Terminal läuft:

[0x2786e8] main interface error: no interface module matched "globalhotkeys,none" 
[0x2786e8] main interface error: no suitable interface module 
[0x201b28] main libvlc error: interface "globalhotkeys,none" initialization failed 
Remote control interface initialized. Type `help' for help. 

Wenn Sie über die Top-Java-Anwendung ausführen:

[0x4009178] main interface error: no interface module matched "globalhotkeys,none" 
[0x4009178] main interface error: no suitable interface module 
[0x2017a8] main libvlc error: interface "globalhotkeys,none" initialization failed 
[0x4009178] main interface error: no suitable interface module 
[0x2017a8] main libvlc error: interface "default" initialization failed 

Kann mir jemand helfen hier? Ich bin ratlos. Vielen Dank.

Antwort

5

Sie können VLC als Unterprozess ausführen und die Befehle über den Prozessausgabestream einspeisen. Sie müssen den Stream spülen und nach jedem Befehl für eine kurze Zeit schlafen. Der folgende Code tut nicht alles - aber es erlaubt mir, verschiedene Dateien in VLC unter Kontrolle von Java zu spielen.

 String vlcParameters = String.format(
      "-I rc --rc-fake-tty --video-on-top --disable-screensaver --no-video-title-show " + 
      "--no-mouse-events --no-keyboard-events --no-fullscreen --no-video-deco " + 
      "--x11-display \"%s\" --video-x %d --video-y %d --width %d --height %d", 
      ":0.0", // X11 display 
      top,  // X 
      left,  //Y 
      width, //Width 
      height  //Height 
      ); 

    ProcessBuilder pb = new ProcessBuilder("vlc", vlcParameters); 

    pb.redirectErrorStream(true); 

    vlcProcess = pb.start(); 

// Later - clear current playlist 

     writer.write("clear\n".getBytes()); 
     writer.flush(); 
     Thread.sleep(10); 

     String playListCommand = String.format(
       "add file://%s\n", 
       filePath); 

     writer.write(playListCommand.getBytes()); 
     writer.flush(); 

     Thread.sleep(milliDuration - 10); 

Hinweis - Sie werden einen weiteren Thread müssen die Ausgabe von VLC zu lesen, damit es nicht blockiert:

 Thread inputThread = new Thread(new Runnable() 
     { 

     @Override 
     public void run() 
      { 
      InputStream in = vlcProcess.getInputStream(); 

      BufferedReader bufin = new BufferedReader(new InputStreamReader(in)); 

      try 
       { 
       while (true) 
       { 
       String line = bufin.readLine(); 

       if (line == null) 
        { 
        System.out.writeln("End of data from VLC"); 
        } 

       System.out.writeln("VLC OUTPUT:" + line); 
       } 
       } 
      catch (IOException ex) 
       { 
       //... 
       } 
      } 
     }, 
     "VLC stdout reader"); 

    inputThread.start(); 
+0

Für jeden, dies implementieren wollen, beachten Sie die "\ n" am Ende jedes Befehls. Beachten Sie außerdem, dass das Schließen des Ausgabestreams zum Herunterfahren der VLC-Instanz führt. Das waren zwei Dinge, die mich erwischt haben. –

0

Seit vlc ein neues DOS-Fenster in rc-Modus öffnet, während writer.flush () Der Code beschwert sich, dass das Rohr geschlossen wurde. Dies wurde auch verifiziert, da inputThread "VLC OUTPUT: nullEnd of data from VLC" ausgibt. Gibt es eine Möglichkeit, es zu vermeiden, mit dem neu geöffneten VCR-Fenster zu verknüpfen?

Grüße

Shahid

Verwandte Themen