Внешняя команда не выполняется полностью - Java - PullRequest
5 голосов
/ 26 марта 2012

Итак, я создаю программу, которая конвертирует файлы .flv в другие форматы.Для этого я использую ffmpeg, который отлично справляется со своей задачей при выполнении через командную строку.Например:

ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3

Этот пример работает как талисман - при выполнении команды не возникает ни одной проблемы.

НО, когда я пытаюсь выполнить ту же команду из Javaкласс возникает проблема.Я делаю это в блоке try-catch:

System.out.println("Start");
Process p = Runtime.getRuntime().exec("cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3");
System.out.println("End");

На консоли выводится «Start».Он начинает преобразовываться и не заканчивается.
Может ли кто-нибудь мне помочь?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2012

Ну, проблема была решена очень неожиданным способом.Мне просто нужно было прочитать вывод, который генерирует выполнение.И, вуаля, файл был конвертирован.

InputStream in = p.getErrorStream();
int c;
while ((c = in.read()) != -1)
{
    System.out.print((char)c);
}
in.close();
3 голосов
/ 26 марта 2012

Две проблемы:

  1. cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 - это , а не команда . (Вы, вероятно, в итоге получите IOException, что приведет к подавлению "End".)

    cmd - команда, которую вы хотите выполнить, а остальная часть строки - аргументы. Используйте ProcessBuilder или Runtime.exec(String[] cmdarray)

  2. Вам нужно дождаться окончания процесса. Позвоните

    p.waitFor();
    

    после запуска процесса. Вот ссылка на документацию Process.waitFor.

0 голосов
/ 26 марта 2012

Прежде всего, это не команда DOS.Это консольная командная строка из любой разновидности Microsoft Windows.

Вы можете сделать это, используя p.waitFor(), как объясняет @aioobe, или вы можете использовать Java API-оболочку для FFMPEG, например Xuggler , это будет легко использовать, и у него есть LGPL.

0 голосов
/ 26 марта 2012

Вы пробовали управлять строкой ", что-то вроде:

cmd "ffmpeg" -i "C:\test.flv" -acodec "libmp3lame" -y "C:\test.mp3"

или

cmd "ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3"
...