Java:使用avconv命令获取视频文件的持续时间

时间:2014-08-12 09:29:50

标签: java bash readline avconv inputstreamreader

我试图使用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()),而不是实际的终端输出。

所以{{1}}似乎没有接收到命令的输出,即使在我输入命令时在终端中完美输出。

为什么Java不能读取此终端输出?

1 个答案:

答案 0 :(得分:0)

使用此 - >

try{
            Process duration = Runtime.getRuntime().exec(new String[] { "sh", "-c", "avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//"});   
String line
BufferedReader in = new BufferedReader(new InputStreamReader(duration.getInputStream()) );
                while ((line = in.readLine()) != null) {
                    System.out.println(line);
               }
}catch(IOException e){
  e.printStackTrace();
}