2013-12-20 48 views
2

我建设的ffmpeg()一个简单的用户界面使用EXEC推出ffmpeg.exe与参数后卡住。它适用于OS X,但在Windows 7,8几秒钟后ffmpeg的过程自动暂停,当我杀死父亲过程只恢复。 (也ddlhost.exe创建) Ffmpeg.exe从CMD成功转换相同的视频。Java运行时的exec()获得,而

在互联网上搜索,我发现这个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); 


} 

回答

2

是否ffmpg写东西到标准输出或标准错误?如果是,你必须消费。 (在单独的线程,因为你需要消耗stderr和并行标准输出)查看详情Process.getInputStream()Process.getErrorStream()。当缓冲区已满时,被调用的程序将停止并挂起。

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

3

你应该叫getInputStream()getErrorStream()Runtime.exec和排水,所有的时间返回的Process该进程正在运行。如果你不这样做,它最终会填满并阻止并停止运行。

例子可见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); 
}