Java:使用avconv命令获取视频文件的持续时间
我试图使用bash命令,用Java获取视频文件的持续时间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
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()
。