2010-02-18 7 views
5

Widziałem już ten wątek, ale nadal mam problem: starting vlc player in java Wygląda na to, że powiązania Java dla VLC nie są już pod aktywnym rozwojem i nie obsługują wszystkiego możliwe w każdym wierszu poleceń.Uruchom VLC w Javie i połącz się z nim za pomocą interfejsu rc

Nie mogę uruchomić VLC z aplikacji Java na Mac OS 10.5.8 (Java 1.6), a następnie połączyć się z nią za pośrednictwem interfejsu rc za pośrednictwem terminala lub innej aplikacji Java.

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(); 
} 

} }

Oto aplikacja Java przy użyciu Apache Commons pakiet netto, który próbuję połączyć się z powyższej aplikacji uruchomionych na tym samym komputerze:

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()); 
    } 
} 
} 

The ta ostatnia aplikacja działa dobrze, jeśli uruchomię VLC przy użyciu poleceń z pierwszej aplikacji w Terminalu. Podobnie, nie mogę połączyć się z pierwszą aplikacją z Terminalu za pomocą "telnet localhost 4444" w Terminalu.

Jedyną różnicą jaką mogę znaleźć jest wyjście z VLC. Podczas pracy w terminalu:

[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. 

Podczas wykonywania przez górną aplikacji Java:

[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 

Czy ktoś może mi pomóc tutaj? Brakuje mi. Dziękuję Ci bardzo.

Odpowiedz

5

Można uruchomić VLC jako podproces i przekazać komendy za pośrednictwem wyjściowego strumienia procesu. Musisz przepłukać strumień i przespać się przez chwilę po każdym poleceniu. Poniższy kod nie robi wszystkiego - ale pozwala mi odtwarzać różne pliki w VLC pod kontrolą Javy.

 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); 

Uwaga - trzeba będzie inny wątek, aby przeczytać wyjście z VLC, więc nie blokuje:

 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

Każdemu chce realizować to należy zwrócić uwagę na "\ n" na koniec każdego polecenia. Należy również pamiętać, że zamknięcie strumienia wyjściowego spowoduje zamknięcie instancji VLC. To były dwie rzeczy, które mnie zaskoczyły. –

0

Od vlc otwiera nowe okno DOS w trybie RC, podczas writer.flush () kod narzeka, że ​​rura została zamknięta. zostało to również zweryfikowane, ponieważ inputThread wypisuje "VLC OUTPUT: nullEnd danych z VLC". Czy istnieje sposób, aby tego uniknąć, aby połączyć się z nowo otwartym oknem vlc rc?

Chodzi

Shahid

Powiązane problemy