Runtime.getRuntime()。exec(command)-无法运行程序,错误= 2,没有此类文件或目录

时间:2020-09-09 21:31:48

标签: java runtime

我想借助ffmpeg获取视频时长:

String command = "ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,"
Runtime.getRuntime().exec(cmdarray);

但是我总是得到 java.io.IOException:无法运行程序“ ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep持续时间| awk'{print $ 2}'| tr -d,“:error = 2,没有这样的文件或目录

如果我从终端运行此命令-一切正常

2 个答案:

答案 0 :(得分:1)

您在这里遇到了几个问题。首先,正如@joy指出的那样,Java用于查找命令的路径可能存在问题,因此Java可能找不到名为“ ffmpeg”的命令。修复用于启动VM的路径应该可以解决该问题,或者只需将完全限定的路径名​​插入“ ffmpeg”即可。

第二:您正在尝试运行终端/ shell命令。 “ |”管道通常由终端/外壳正确解释,该终端/外壳将链分成连接stdout / stdin的子进程。但是,Java被要求运行“ ffmpeg”,并传入一些包含“ |”的参数。 “ ffmpeg”将无法按您的意愿进行处理。

检查您使用的外壳:

echo $SHELL

假设打印了/bin/bash-您可以通过使Java启动外壳并使其解释管道命令来进行修复:

String[] command = new String[] { "/bin/bash", "-c", "ffmpeg -i /home/user/Videos/my-video.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ," };
Runtime.getRuntime().exec(cmdarray);

答案 1 :(得分:0)

从终端运行时和从Java运行时,路径很可能不相同。 1.您可以尝试使用ffmpeg的完整路径(在终端中运行“ which ffmpeg”)。 2. ffmpeg可能是您的.profile文件中的别名,在这种情况下,您可以先尝试在Java中执行命令之前先加载(载入)您的.profile文件。