Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java swing GUI中被阻止的外部进程_Java_Swing_Process_Ffmpeg_Runtime.exec - Fatal编程技术网

Java swing GUI中被阻止的外部进程

Java swing GUI中被阻止的外部进程,java,swing,process,ffmpeg,runtime.exec,Java,Swing,Process,Ffmpeg,Runtime.exec,我正在用JavaSwing和ffmpeg开发一个编码器。我创建了一个GUI界面,在其中我指定了我的输入(设备、帧速率、比特率..)。然后我调用ffmpeg进行编码和流式传输 我的问题是,encoding类在主类中执行得很好,但在swing接口(特别是jButtonactionperformed())中调用时会被阻塞 有人能帮我吗 这是我的按钮动作 private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

我正在用JavaSwing和ffmpeg开发一个编码器。我创建了一个GUI界面,在其中我指定了我的输入
(设备、帧速率、比特率..)
。然后我调用
ffmpeg
进行编码和流式传输

我的问题是,encoding类在主类中执行得很好,但在swing接口(特别是
jButtonactionperformed()
)中调用时会被阻塞

有人能帮我吗

这是我的按钮动作

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    Encode s = new Encode();
    s.Encode(cmdLine);
}
这是我的编码方法

public void Encode(String cmdLine) {
    try {
        Process p2 = Runtime.getRuntime().exec(cmdLine);
        //logProcessOutputAndErrors(p2); 
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }
}

Ps:Cmdline是我从输入中收集的命令。首先,将Encode方法转换为可运行类

public class Encode implements Runnable {

    protected String    cmdLine;

    public Encode(String cmdLine) {
        this.cmdLine = cmdLine;
    }

    @Override
    public void run() {
        try {
            Process p2 = Runtime.getRuntime().exec(cmdLine);
            // logProcessOutputAndErrors(p2);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
然后,将类实例化为线程,并启动它

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    Encode s = new Encode(cmdLine);
    new Thread(s).start();
}

那么,你想从我们这里得到一个关于线程的教程吗?你应该在一个单独的线程中启动ffmpeg任务,以免阻塞ui线程。事实上,我在一个单独的类中执行ffmpeg命令,但我在执行的jButtonaction中调用这个类@简·德沃夏克:我读过关于线程的文章,但我不能应用它。如果您能更详细地解释一下,这里是我的按钮操作private void jButton3ActionPerformed(java.awt.event.ActionEvent evt){Encode s=new Encode();s.Encode(cmdLine);}这是我的编码方法public void Encode(String cmdLine){try{Process p2=Runtime.getRuntime().exec(cmdLine);//logProcessOutputAndErrors(p2);}catch(Exception ex){ex.printStackTrace();}}}Ps:cmdLine是我从输入中收集的命令1)“这是我的按钮操作”为了更快地获得更好的帮助,请将一个作为问题的答案。2)如果坚持
过程
,请执行的所有建议。3)为什么不使用jffmpeg和旁侧步骤(更麻烦,更少控制)
过程
?4)添加@clamp(或其他人)谢谢你的回答,Gilbert le Blanc。我复制和粘贴这个,但是我有相同的结果。我的流服务器接收我选择的选项(率…),但是(NETSuff.Fuff.Flash)直到我关闭界面。进程不再阻塞,FFMPEG启动BuffRulf等。(@user1932255:除了阻止事件分派线程之外,您还有更多的问题。您必须以某种方式将音频缓冲区返回到GUI,并让GUI知道缓冲区已完成。我担心堆栈溢出时可能会处理更多问题。当我在主类(而不是GUI)中执行相同代码时这很好,我得到了我的流(缓冲区已满)。这就是为什么我想到了事件分派问题。当我在一个主类(而不是GUI)中执行相同的代码时,这很好,我得到了我的流(缓冲区已满)。这就是为什么我想到了事件分派问题