Java 在主进程内写入子进程

Java 在主进程内写入子进程,java,linux,shell,raspberry-pi,Java,Linux,Shell,Raspberry Pi,我正在尝试从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 我试图在运行实时视频蒸汽

我正在尝试从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)
但它需要重新启动complete raspivid命令才能在web上生效,就像首先终止raspivid进程一样,添加相应的控件并再次重新启动complete raspivid命令。 是否可以为raspivid控件运行单独的命令?我的意思是,不同的raspivid命令可以启动流媒体,不同的命令可以在不中断前一个命令的情况下添加对比度和亮度。如果没有,我们如何做到这一点

有没有办法在主进程中写入子进程,以便我们可以重新启动子进程而不影响正在运行的主进程


提前感谢

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

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

  • 允许从文件中读取程序参数
  • 在某些信号上,例如,
    SIGUSR2
    -重新读取上述文件中的参数
目前它不是这样设计的。下面是一个想法:在signa
SIGUSR1
上暂停/运行程序,但重新读取其运行时参数。因此,你不能用简单的方法做你想做的事

你真正能做的是:

第一,最佳方式:

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

    • 一个用于从文件中读取参数
    • SIGUSR2的信号处理子程序
可能不是很难,但您必须了解
C
并了解
raspvid
的工作原理

第二:

  • 编写一个包装器(用java、bash或任何编程语言),可以:
    • 在某些时间间隔(或在某些信号上)将读取带有参数的文件
    • 检查运行的进程
      raspvid
    • 如果存在-杀死它
    • 并从文件中的新参数开始
因此,主要的周期是:

  • 将所有需要的(不仅是对比度,而且是所有)参数添加到定义的文件中
  • 将SUGUSR1信号发送到
    • raspvid过程(在修补respvid的情况下)
    • 到包装器脚本(在第二种情况下)
  • 它会的
    • 重新启动自身(如果为1)
    • 终止和重新启动(在2的情况下)

第二个解决方案是可行的-你应该谷歌“bash信号悬挂”或“bash陷阱信号”。。。网络上已经有很多示例。

唯一可以这样做的方法是使用命名的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有一定数量的缓冲区要填充,如果它被填满,第一个进程很可能会死亡。

这与Java有什么关系?我正在用Java创建一个应用程序,它使用ProcessBuilder运行raspberry pi的这些命令。好的,这可能值得在您的问题中描述。好的,谢谢,你打算在这方面帮助我吗?可以修补raspivid并重新编译它吗?谢谢你的回复,但信息文档和手册页的情况是一样的。我还没有找到任何关于raspivid控件的内容来控制不同进程的视频流。感谢您的帮助,我已经实现了相同的功能,我正在动态设置所有参数并终止并重新启动命令。