2013-12-20 2 views
2

Я создаю простой интерфейс для запуска ffmpeg ffmpeg.exe с параметрами с помощью exec(). он работает на Os X, но в Windows 7-8 через несколько секунд процесс ffmpeg приостанавливается и возобновляется только тогда, когда я убиваю процесс отца. (также создается ddlhost.exe) Ffmpeg.exe успешно конвертирует одно и то же видео из cmd.Java Runtime exec() застрял через некоторое время

Поиск в Интернете Я нашел это answer, но у меня такая же проблема, когда запускается простая тестовая программа, которая не использует потоки ввода и ошибки.

Вот тест программный код, который имеет ту же проблему, основной один:

public class Main { 

static String param_ffmpeg_1 = "./data/ffmpeg.exe"; 
static String param_ffmpeg_2 = "-i"; 

static String in = "./data/source.mov"; 
static String out = "./data/out.flv"; 

static Process p; 

public static void main(String[] args) { 

    /*File f = new File(out); 

    if (f.exists()){ 
     f.delete(); 
    }*/ 


    Runtime rt = Runtime.getRuntime() ; 
    //String cmd1 = param_ffmpeg_1 + param_ffmpeg_2 + in_path + param_ffmpeg_3 + out_path ; 
    System.out.println(in); 
    System.out.println(out); 
    String[] cmd1 = new String[] { param_ffmpeg_1, param_ffmpeg_2, in, "-ar", "44100", "-vb", "2500k", "-s", "882x496", "-f", "flv", out}; 

    try { 
     p = rt.exec(cmd1); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    int r = 123456; 
    try { 
     r = p.waitFor(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println(r); 


} 

}

ответ

2

ли ffmpg писать что-либо на стандартный вывод или поток ошибок? Если да, вы должны это использовать. (В отдельных потоках, так как вам необходимо использовать stderr и параллельную параллельную установку), см. Process.getInputStream() и Process.getErrorStream(). Когда буфер буфера заполнен, ваша вызываемая программа останавливается и зависает.

Тот факт, что он работает в ОС/X, но не в Windows, может быть вызван различными размерами буфера.

3

Вы должны позвонить getInputStream() и getErrorStream() на Process возвращенного Runtime.exec и стоком, что все время процесс выполняется. Если вы этого не сделаете, он в конечном итоге заполнит и заблокирует и остановит процесс.

Для примера см. Java Process with Input/Output Stream.

От the accepted answer

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 
InputStream itsOutput = process.getInputStream(); 
// Wrap the stream in a Reader ... 
while ((line = reader.readLine()) != null) { 
    System.out.println ("Stdout: " + line); 
} 
Смежные вопросы