【发布时间】:2014-08-12 09:29:50
【问题描述】:
我正在尝试使用 bash 命令使用 Java 获取视频文件的持续时间
avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//
当我刚刚在终端中输入上述命令时,终端中恰好显示一个输出行,显示持续时间如下:
00:09:56.45
现在我想从 Java 运行这个命令并接收输出的持续时间作为字符串。我的代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args){
String command = "avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//";
StringBuffer output = new StringBuffer();
Process p;
String result = "init";
try {
p = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
result = in.readLine();
in.close();
} catch (IOException e) { e.printStackTrace(); }
System.out.println(result);
}
}
但是,这会返回 null。所以result 的值被result = in.readLine()) 改变,但是,result = null 被设置,而不是实际的终端输出。
所以in.readLine()) 似乎没有接收到命令的输出,即使当我在终端输入命令时这已在终端中完美输出。
为什么 Java 不能读取这个终端输出?
【问题讨论】:
-
另外注意,不要使用
avconv使用ffmpeg来自ffmpeg.org。 avconv 是 ffmpeg 的一个分支,它显示了一些问题......此外,您需要 ffmpeg 包中的 ffprobe 命令。 -
您将
result初始化为null,然后将其与+=一起使用。试试String result = "";。 -
@Djon 感谢您指出我发布的代码中的错误。我在我的问题中更正了它。不幸的是,我的问题仍然存在。 PS:我使用 avconv 而不是 ffmpeg,因为 avconv 似乎是最新 Ubuntu 中 ffmpeg 的替代品(?)
-
所以你的问题是
in.readLine()返回null。您是否尝试过使用简单的命令来确保该过程正常运行? -
我想你可能已经将输出重定向到 stderr,试试
p.getErrorStream()。
标签: java bash readline avconv inputstreamreader