2017-05-26 2 views
1

Ich habe ein einfaches Programm und UI dafür erstellt. Es hat einen Knopf ffmpeg.exe zum Starten ein Video zu dekodieren:Der Prozess wird unterbrochen, bis ich das Programm schließe

button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      ProcessBuilder pb = new ProcessBuilder("D:\\ffmpeg.exe", "-i", "\"D:\\video\\input.mp4\"", "\"output.mp4\""); 
      try { 
       Process p = pb.start(); 
      } catch (IOException error) { 
       // 
      } 
     } 
    } 

Das Problem ist, dass, nachdem die Schaltfläche ffmpeg beginnt klicken, aber es hat nichts tun (im Task-Manager ist es nicht CPU verwenden - 0%), bis ich das Programm (UI) schließen und dann ffmpeg Prozess beginnt ein Video zu dekodieren (nur nach dem Programm ffmpeg schließen beginnt cpu mit - zB 24%)

Es ist nicht duplizieren: ältere Fragen vorgeschlagen von Andy Thomas hat keine Antwort (Lösung) für mein Problem

+0

Funktioniert das Ausführen Ihres Befehls in cmd? '' 'D: \\ ffmpeg.exe -i D: \\ video \\ input.mp4 \ \ output.mp4 \' '' –

+0

scheint es als ein Ausgangspfad Fehler zu mir bereits –

+0

@FahadSiddiqui gibt es keine solche Fehler, Entschuldigung. Wie ich bereits sagte, funktioniert es aber nur, wenn ich das Programm schließe – user924

Antwort

2

Ihre Process blockiert die event dispatch thread. Führen Sie stattdessen Ihre ProcessBuilder im Hintergrund einer SwingWorker, wie in dieser vollständigen example gezeigt.

@Override 
    protected Integer doInBackground() { 
     try { 
      ProcessBuilder pb = new ProcessBuilder(
       "D:\\ffmpeg.exe", "-i", "\"D:\\video\\input.mp4\"", "\"output.mp4\"")); 
     … 
    } 

Beachten Sie, dass das Beispiel redirectErrorStream(true) aufruft, so sollten Sie in der Lage sein, alle Fehler zu finden oder Aufforderungen von ffmpeg.exe.

+1

das ist genial, danke :) – user924

Verwandte Themen