首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在主进程内写入子进程

在主进程内写入子进程
EN

Stack Overflow用户
提问于 2014-08-12 13:54:53
回答 3查看 366关注 0票数 1

我正在尝试实现来自覆盆子圆周率摄像头的直播视频。我是一名java开发人员,对Linux知之甚少。

我使用下面的命令成功地实现了raspivid命令,在网页上直播视频;

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

我正在尝试添加一些控制运行现场视频流,如增加对比度和亮度等

代码语言:javascript
复制
--contrast, -co Set image contrast (-100 to 100)
--brightness, -br Set image brightness (0 to 100)

但它需要重新启动完整的raspivid命令才能在web上生效,就像首先要杀死raspivid进程,添加相应的控件,然后再次重新启动完整的raspivid命令。可以为raspivid控件运行单独的命令吗?我是说,不同的raspivid命令可以启动流式传输,不同的raspivid命令可以在不中断先前命令的情况下增加对比度和亮度。如果不是,那我们该怎么做呢?

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

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2014-08-22 09:19:44

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-08-24 19:29:02

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

  • 允许在某些信号上从文件重新读取程序参数,例如,从上面的文件

重新读取参数

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

你真正能做的是:

第一-最好的方法:

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

代码语言:javascript
复制
- one for reading arguments from an file
- subroutine for signal handling for the `SIGUSR2`

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

第二:

  • 写一个包装器(用file

,或bash或任何编程语言),在某些时间间隔(或在某些信号上)将读取带有arguments

  • checks的文件

  • 正在运行的file

的进程存在- kill it

  • ,并使用来自java的新参数启动它

因此,主要的循环将是:

  • 将所有需要的参数(不仅是对比度,而且是所有)参数添加到已定义的文件中
  • 将SUGUSR1信号发送到
    • raspvid进程(在修补respvid的情况下)
    • to wrapper脚本(在第二个respvid中

在1)

  • kill&restart的情况下(在2)

的情况下),

  • 并将重新启动
    • 本身

第二个解决方案很容易做到--你应该用谷歌搜索"bash信号挂起“或"bash陷阱信号”……网上已经有很多例子了。

票数 0
EN

Stack Overflow用户

发布于 2014-08-27 22:40:34

执行此操作的唯一方法是使用命名FIFO

在您的示例中可能是这样的:

代码语言:javascript
复制
$ 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有一定数量的缓冲区需要填充,如果它已满,第一个进程很可能会死。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25257077

复制
相关文章

相似问题

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