Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用avconv命令获取视频文件的持续时间_Java_Bash_Readline_Avconv_Inputstreamreader - Fatal编程技术网

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

Java:使用avconv命令获取视频文件的持续时间,java,bash,readline,avconv,inputstreamreader,Java,Bash,Readline,Avconv,Inputstreamreader,我试图使用bash命令,用Java获取视频文件的持续时间 avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,// 当我在terminal中输入上述命令时,terminal中正好显示一行输出,显示如下持续时间: 00:09:56.45 现在我想从Java运行这个命令,并以字符串形式接收输出的持续时间。我的代码如下: import java.io.BufferedReader; import

我试图使用bash命令,用Java获取视频文件的持续时间

avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//
当我在terminal中输入上述命令时,terminal中正好显示一行输出,显示如下持续时间:

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,而不是实际的终端输出

因此,.readLine())
中的
似乎没有接收到命令的输出,即使当我在终端中输入命令时这是完美的输出

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

使用这个->

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();
}

另一方面,不要使用来自的
avconv
使用
ffmpeg
。avconv是ffmpeg的一个分支,它显示了一些问题。。。此外,您还需要ffmpeg包中的ffprobe命令。您将
结果
初始化为null,然后将其与
+=
一起使用。尝试
字符串结果=”
@Djon感谢您指出我发布的代码中的错误。我已在我的问题中更正了它。不幸的是,我的问题仍然存在。PS:我使用avconv而不是ffmpeg,因为avconv似乎是最新Ubuntu(?)中ffmpeg的替代品,所以你的问题是
in.readLine()
返回
null
。您是否尝试过使用一个简单的命令来确保进程正常运行?我想您可能已经将输出重定向到stderr,请尝试
p.getErrorStream()