所以,我正在构建一个将.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");
控制台打印“开始”。它开始转换,但没有完成 有人可以帮帮我吗?
答案 0 :(得分:5)
嗯,问题以非常意外的方式解决了。我只需要读取执行生成的输出。而且,瞧,文件已被转换。
InputStream in = p.getErrorStream();
int c;
while ((c = in.read()) != -1)
{
System.out.print((char)c);
}
in.close();
答案 1 :(得分:3)
两个问题:
cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3
不是命令。 (您可能最终得到IOException
,导致"End"
被抑制。)
cmd
是您要执行的命令,其余字符串是参数。使用ProcessBuilder
或Runtime.exec(String[] cmdarray)
您需要等待该过程完成。呼叫
p.waitFor();
启动过程后。这是Process.waitFor
文档的链接。
答案 2 :(得分:0)
您是否尝试过控制字符串“,例如:
cmd "ffmpeg" -i "C:\test.flv" -acodec "libmp3lame" -y "C:\test.mp3"
或
cmd "ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3"
答案 3 :(得分:0)
首先,这不是DOS命令。它是一个控制台命令行,来自任何风格的Microsoft Windows。
您可以使用p.waitFor()
来解决这个问题,或者您可以像Xuggler那样使用FFMPEG的包装Java API,它很容易使用,而且它有LGPL。