Java 运行时 exec() 一段时间后卡住了

标签 java process ffmpeg exec

我正在为 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);


}

}

最佳答案

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

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

关于Java 运行时 exec() 一段时间后卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707295/

相关文章:

c# - 从 Process.Start 记录到文本文件

android - 如何在单个.mp4 ffmpeg android中合并多个.mp4文件

java - Java 8 的 Optional.ifPresent 和 if-not-Present 的功能风格?

Java PathMatcher 在 Windows 上无法正常工作

process - 当 CPU 分配给用户进程时,谁在操作系统中运行调度程序?

c - linux上进程的开始时间

ffmpeg - 使用 FFmpeg 将 2 个 FLV 电影并排放置

Android,使用ffmpeg将gif分割成帧

java - Apache 公共(public)资源 : ClassNotFoundException

java - 区分循环中同名的局部变量