我想借助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,没有这样的文件或目录
如果我从终端运行此命令-一切正常
答案 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文件。