【问题标题】:Java: Get duration of video file with avconv commandJava:使用 avconv 命令获取视频文件的持续时间
【发布时间】: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


【解决方案1】:

使用这个 ->

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

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 2016-04-23
    • 2016-11-01
    • 1970-01-01
    • 2013-03-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多