【问题标题】:write subprocess inside main process在主进程中写入子进程
【发布时间】:2014-08-12 05:54:53
【问题描述】:

我正在尝试实现来自 raspberry pi cam 的实时流媒体视频。我是一名 Java 开发人员,对 Linux 知之甚少。

我已成功实现 raspivid 命令,使用以下命令在网页上流式传输实时视频;

raspivid -t 0 -w 960 -h 540 -fps 25 -b 500000 -vf -o - | ffmpeg -i - -vcodec copy -an -f flv -metadata streamName=myStream tcp://0.0.0.0:6666

我正在尝试添加一些运行实时视频流的控件,例如添加对比度和亮度等

--contrast, -co Set image contrast (-100 to 100)
--brightness, -br Set image brightness (0 to 100)

但是需要重启完整的raspivid命令才能在web上生效,比如先杀掉raspivid进程添加相应的控件,然后再重启完整的raspivid命令。 是否可以为 raspivid 控件运行单独的命令?我的意思是不同的 raspivid 命令开始流式传输,不同的命令可以在不中断前一个命令的情况下添加对比度和亮度。如果没有,那我们怎么做呢?

有什么办法可以在主进程中写一个子进程,这样我们就可以在不影响主运行进程的情况下重启子进程?

提前致谢

【问题讨论】:

  • 这和Java有什么关系?
  • 我正在用 Java 创建一个应用程序,它使用 ProcessBuilder 运行树莓派的这些命令。
  • 好的,那么在你的问题中可能值得描述一下。
  • 好的,谢谢,你会在这方面帮助我吗?
  • 给raspivid打补丁并重新编译可以吗?

标签: java linux shell raspberry-pi


【解决方案1】:

如果您只想在不同进程中触发命令,此线程可能会有所帮助。但是我不确定这会解决问题。我还会阅读 rapsivid 的信息文档,因为信息文档通常比手册页更容易阅读。只需在命令提示符下键入 info rapsivid。

How to execute system commands (linux/bsd) using Java

【讨论】:

  • 感谢您的回复,但信息文档和手册页的情况相同。我没有找到任何关于 raspivid 控件来控制具有不同进程的视频流的任何信息。
【解决方案2】:

为了接受(附加)外部控制,raspvid 应用程序必须以这种逻辑编写。更简单的方法是:

  • 允许从文件中读取程序参数
  • 在某些信号上,例如SIGUSR2 - 从上述文件中重新读取参数

目前不是这样设计的。这是一个想法,在信号 SIGUSR1 上暂停/运行程序,但重新读取其运行时参数。因此,你不能用简单的方式做你想做的事。

你真正能做什么:

第一 - 最好的方法:

  • 修补 raspvid 以允许上述功能。它是用C编写的。所以,需要实现两个子程序:

    • 用于从文件中读取参数
    • SIGUSR2 的信号处理子程序

可能不是很难,但您必须了解 C 并了解 raspvid 的工作原理。

第二:

  • 编写一个包装器(用 java、bash 或任何编程语言),它会:
    • 在某些时间间隔内(或在某些信号上)将读取带有参数的文件
    • 检查正在运行的进程raspvid
    • 如果存在 - 杀死它
    • 并使用文件中的新参数启动它

所以,主循环是:

  • 将所有需要的(不仅是对比,而且是所有)参数添加到定义的文件中
  • 发送SUGUSR1信号到
    • raspvid 进程(在修补 respvid 的情况下)
    • 到包装脚本(在第二种情况下)
  • 它会
    • 自行重启(在 1 的情况下)
    • kill&restart(如果是 2)

第二种解决方案很容易实现——你应该在谷歌上搜索“bash 信号挂起”或“bash 陷阱信号”......网上已经有很多例子了。

【讨论】:

  • 谢谢,我已经实现了相同的,我正在动态设置所有参数并杀死并重新启动命令。
【解决方案3】:

您可以这样做的唯一方法是使用命名的 FIFO

在你的例子中可能是这样的:

$ mkfifo /tmp/FIFOVIDEO
$ raspivid -t 0 -w 960 -h 540 -fps 25 -b 500000 -vf -o /tmp/FIFOVIDEO &
$ ffmpeg -i /tmp/FIFOVIDEO -vcodec copy -an -f flv -metadata streamName=myStream tcp://0.0.0.0:6666

在这种情况下,您可以在短时间内停止和启动进程号 2。

请注意,命名的 FIFO 有一定数量的缓冲区要填充,如果它被填满,第一个进程很可能会死掉。

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2012-03-04
    相关资源
    最近更新 更多