首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >()会在一段时间后陷入困境

()会在一段时间后陷入困境
EN

Stack Overflow用户
提问于 2013-12-20 15:49:17
回答 2查看 2.4K关注 0票数 3

我正在为ffmpeg构建一个简单的UI,使用exec()启动带有参数的ffmpeg.exe。它在Os上工作,但在Windows7-8上,几秒钟后,ffmpeg进程挂起,只有当我杀死父进程时才会恢复。(也创建了ddlhost.exe ) Ffmpeg.exe成功地从cmd转换相同的视频。

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

下面是测试程序代码,它具有与主要程序相同的问题:

代码语言:javascript
复制
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);


}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-20 15:58:41

ffmpg给stdout或stderr写了什么吗?如果是的话,你得把它吃了。(在单独的线程中,您需要并行地使用stderr和stdout ),有关详细信息,请参阅Process.getInputStream()Process.getErrorStream()。当缓冲区已满时,调用的程序将停止并挂起。

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

票数 4
EN

Stack Overflow用户

发布于 2013-12-20 15:55:41

您应该在由getInputStream()返回的Process上调用Runtime.execgetErrorStream(),并在进程运行的所有时间排出这些数据。如果您不这样做,那么它最终会填充、阻塞和停止进程的运行。

有关示例,请参见具有输入/输出流的Java进程

来自被接受的答案

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20707295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档