【问题标题】:Java Runtime exec() get stuck after a whileJava Runtime exec() 一段时间后卡住了
【发布时间】:2014-01-09 12:46:52
【问题描述】:

我正在为 ffmpeg 构建一个简单的 UI,使用 exec() 启动带有参数的 ffmpeg.exe。它可以在 OS X 上运行,但在 Windows 7-8 上几秒钟后,ffmpeg 进程会自行挂起,只有在我杀死父进程时才会恢复。 (也创建了 ddlhost.exe) ffmpeg.exe从cmd成功转换同一个视频。

在互联网上搜索我发现了这个answer,但我在运行一个不使用输入和错误流的简单测试程序时遇到了同样的问题。

下面是测试程序代码,和主程序有同样的问题:

public class Main {

static String param_ffmpeg_1 = "./data/ffmpeg.exe";
static String param_ffmpeg_2 = "-i";

static String in = "./data/source.mov";
static String out = "./data/out.flv";

static Process p;

public static void main(String[] args) {

    /*File f = new File(out);

    if (f.exists()){
        f.delete();
    }*/


    Runtime rt = Runtime.getRuntime() ;
    //String cmd1 =  param_ffmpeg_1 + param_ffmpeg_2 +  in_path +  param_ffmpeg_3 + out_path ;
    System.out.println(in);
    System.out.println(out);
    String[] cmd1 = new String[] { param_ffmpeg_1, param_ffmpeg_2, in, "-ar", "44100", "-vb", "2500k", "-s", "882x496", "-f", "flv", out};

    try {
        p = rt.exec(cmd1);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    int r = 123456;
    try {
        r = p.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(r);


}

}

【问题讨论】:

    标签: java process ffmpeg exec


    【解决方案1】:

    ffmpg 是否向标准输出或标准错误写入任何内容?如果是的话,你必须消耗它。 (在单独的线程中,因为您需要并行使用标准错误和标准输出)请参阅Process.getInputStream()Process.getErrorStream() 了解详细信息。当缓冲区已满时,您调用的程序将停止并挂起。

    它在 OS/X 而不是 Windows 中工作的事实可能是由不同的缓冲区大小造成的。

    【讨论】:

      【解决方案2】:

      您应该在Runtime.exec 返回的Process 上调用getInputStream()getErrorStream(),并在进程运行的所有时间将其排空。如果你不这样做,那么它最终会填满并阻塞并停止进程运行。

      有关示例,请参阅 Java Process with Input/Output Stream

      来自the accepted answer

      ProcessBuilder builder = new ProcessBuilder("/bin/bash");
      builder.redirectErrorStream(true);
      Process process = builder.start();
      InputStream itsOutput = process.getInputStream();
      // Wrap the stream in a Reader ...
      while ((line = reader.readLine ()) != null) {
          System.out.println ("Stdout: " + line);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-17
        • 2016-10-22
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        相关资源
        最近更新 更多