我在Ubuntu服务器上从java程序执行ffmpeg命令时遇到错误。当我在putty中执行它成功执行但是从java中它给了我
的例外java.io.IOException: Cannot run program "/usr/bin/ffmpeg ":
error=2, No such file or directory
我的代码如下:
public String convert3gpTomp4(File contentFile, String filename) {
String[] cmd = new String[6];
filename = StringUtils.substringBefore(filename, ".");
cmd[0] = "/usr/bin/ffmpeg ";
cmd[1] = "-y ";
cmd[2] = "-i ";
cmd[3] = contentFile.getPath();
cmd[4] = " -acodec copy ";
String myfilename = filename +"eg.mp4";
cmd[5] = contentFile.getParent() + "/" + myfilename;
if (execute(cmd)){
return myfilename;
}else{
return null;
}
}
}
public boolean execute(String[] cmd){
try{
Runtime rt= Runtime.getRuntime();
Process proc = rt.exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
int exitVal = proc.waitFor();
String sb = outputGobbler.sb.toString();
String eb = errorGobbler.sb.toString();
System.out.println("Command Exceute Exit value: " + exitVal);
proc.destroy();
return true;
}
catch(java.io.IOException e ){System.out.println("IOException "+e);e.printStackTrace();}
catch(java.lang.InterruptedException e){}
return false;
}
输出ffmpeg命令:
/usr/bin/ffmpeg -y -i /mydata/clip1.3gp -acodec copy /mydata/clip1eg.mp4
当我在putty中运行上面的命令时,它会从Java程序成功执行。
在该计划中,我也试过以下但没有成功。
usr/bin/ffmpeg
/bin/ffmpeg
ffmpeg
/root/usr/bin/ffmpeg
请让我知道我做错了什么。
谢谢,
答案 0 :(得分:1)
您必须删除二进制文件后的尾随空白
更改"/usr/bin/ffmpeg "
这个
到"/usr/bin/ffmpeg";
修改强>
对我来说,问题似乎是可执行文件名称有一个尾随空白,并且参数未按预期传递给被调用进程。
0: [/usr/bin/ffmpeg ] <-- traling blank makes a problem
1: [-y ] <-- unsure if the trailing blank would make problem there
2: [-i ] <-- unsure if the trailing blank would make problem there
3: [/mydata/clip1.3gp]
4: [ -acodec copy ] <-- this should passed as two parameters to the process
5: [/mydata/clip1eg.mp4]
应该更像是
0: [/usr/bin/ffmpeg]
1: [-y]
2: [-i]
3: [/mydata/clip1.3gp]
4: [-acodec]
5: [copy]
6: [/mydata/clip1eg.mp4]
所以对发布的代码的更改应该是
String[] cmd = new String[7];
...
cmd[0] = "/usr/bin/ffmpeg";
cmd[1] = "-y";
cmd[2] = "-i";
cmd[3] = contentFile.getPath();
cmd[4] = "-acodec";
cmd[5] = "copy";
String myfilename = filename + "eg.mp4";
cmd[6] = contentFile.getParent() + "/" + myfilename;
答案 1 :(得分:1)
要查找ffmpeg的完整路径,请从您的putty运行以下命令:
which ffmpeg
如果按rpm包安装,则默认路径为/usr/bin/ffmpeg
。
答案 2 :(得分:0)
我也有这个问题,通过以下方式解决:
首先我在 ffmpeg
中的 /home/ffmpeg/ffmpeg
,当在 shell
中运行时它可以工作,但在我的 java 程序中,它出错了 java.io.IOException: Cannot run program “usr/bin/ffmpeg ”: error=2, No such file or directory
然后我将它添加到 /usr/local/bin/ffmpeg
并链接到 /home/ffmpeg/ffmpeg
,如下所示,它起作用了。
[webedit bin]$ pwd.
/usr/local/bin
[webedit bin]$ ls -lh
total 1.6M
lrwxrwxrwx 1 root root 19 Jun 8 09:34 ffmpeg -> /home/ffmpeg/ffmpeg
lrwxrwxrwx 1 root root 20 Jun 8 09:34 ffprobe -> /home/ffmpeg/ffprobe
你可以试试