开始/停止 Ffmpeg 视频捕获

3

我目前正在使用ffmpeg从网络摄像头源录制视频。

目前我使用Java调用ffmpeg执行录制操作。

代码相当简单明了。

ffmpeg -f dshow -i video="Dualpix HD720p for Notebooks" -s cif -r 20 -f flv TEST.FLV
Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " + cmd);

而且它运行得很好。

唯一的真正问题是当我需要停止录制过程时。

我知道我可以在CMD中按q或甚至ctrl+c,但我需要在没有键盘输入的情况下停止进程。

这样做很容易被杀死进程,但在这种情况下,ffmpeg不会完成视频处理,导致输出文件损坏,需要修复。

是否有任何方法可以“远程”触发最终处理过程呢?

谢谢, D。

*******编辑**********

感谢及时回答,我想你指的是

Process.getOutputStream()

对于这种情况,我已经尝试了以下代码:

public Process doCommand(String cmd) throws Exception {

    rt = Runtime.getRuntime();
    Process proc = rt.exec(cmd);
    recOS= proc.getOutputStream();
    regcIS= proc.getInputStream();

    return proc;

}

   receOS.write(("q/n".getBytes()));
   recOS.flush();

我仍然遇到一个错误,更具体地说,是java.io.IOException: 管道正在关闭...


http://stackoverflow.com/questions/17123118/how-to-stop-ffmpeg-that-runs-through-java-process - ecle
https://dev59.com/f27Xa4cB1Zd3GeqPr6LO - ecle
你解决了吗?我也在尝试做同样的事情。你能分享一下你的答案吗?谢谢。 - oneofakind
@Panina,你解决了吗?我也遇到了这个问题。如果你能发布你的答案,那会更有帮助。 - Liya
2个回答

3
您需要发送“q\n”给ffmpeg进程。为此,您首先需要使用“Process.getInputStream()”获取“InputStream”,然后发送输入。
最好您先了解一下如何从Java控制子进程。这里有一些很好的SO帖子,请搜索“ProcessBuilder”。

1

你好,我也在尝试实现这个。但是,什么使得这个答案是正确的呢? - oneofakind
@oneofakind,我仍然感到困惑,为什么我的答案得到了绿色的批准,因为我的意图更多是建议使用Java库支持的不同方法,而不是关于如何停止通过Process实例调用的当前ffmpeg进程的具体答案。 - ecle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接