ffmpeg, выполненный из Java Processbuilder, не возвращается под Windows 7 - PullRequest
2 голосов
/ 27 марта 2012

Я пытался создать ProcessBuilder, вызывающий двоичный файл ffmpeg. Моя проблема в том, что при его вызове он прекрасно возвращается под MacOs, Ubuntu и WindowsXp, но под Windows7 waitFor () никогда не возвращается.

Кто-нибудь имел подобный опыт под windows 7? Любая помощь будет оценена!

Моя команда:

ProcessBuilder pb = new ProcessBuilder( );

pb.command( "C:\\Windows\\System32\\cmd.exe", "/c", "c:\\ffmpeg\\bin\\ffmpeg.exe", "-version" ); 

Пробовал и эти:

pb.command( "c:\\ffmpeg\\bin\\ffmpeg.exe", "-version" ); 
pb.command( "C:\\Windows\\System32\\cmd.exe", "/c", "start c:\\ffmpeg\\bin\\ffmpeg.exe -version" ); 

Результат тот же. (

Ответы [ 3 ]

6 голосов
/ 27 марта 2012

Похоже, ваш процесс записывает что-то в свои потоки out и / или err. Их переполнение буфера и обработка блоков. Чтобы избежать этого, вы должны прочитать и ошибиться в потоках вашего процесса.

См. " Когда Runtime.exec () не будет " для получения дополнительной информации

2 голосов
/ 08 июля 2012

Если вы используете Java 7, вы можете сделать что-то вроде этого:

File encodingFile = new File(outfile + ".encoding");
ProcessBuilder pb = new ProcessBuilder(vars.config.ffmpeg, "-i", file, "-y", "-s", width + "x" + height, "-vcodec", "libvpx", outfile); //or other command....
encodingFile.createNewFile();
pb.redirectErrorStream(true);
pb.redirectInput(ProcessBuilder.Redirect.PIPE); //optional, default behavior
pb.redirectOutput(encodingFile);
Process p = pb.start();

// if you want to wait for the process to finish
p.waitFor();
encodingFile.delete();
0 голосов
/ 22 марта 2019

вы должны сделать что-то вроде этого

        ProcessBuilder pb = new ProcessBuilder( );
        pb.command( "C:\\Windows\\System32\\cmd.exe", "/c", 
        "c:\\ffmpeg\\bin\\ffmpeg.exe", "-version" ); 
        Process process = pb.start();
        OutputStream stdOutput = process.getOutputStream();
        InputStream inputStream = process.getInputStream();
        InputStream errorStream = process.getErrorStream();

, тогда это будет работать, поскольку ваш процесс выдает какой-то вывод, но вы его не читаете

...