2

我正在开发一个项目,将 HDTV 从个人计算机流式传输到支持 HTTP 实时流式传输的设备(想想 iOS 设备和一些 android)。我有视频的格式和流媒体方面的内容。我现在尝试实现的是一种远程更改频道的简单方法。

我当前的方法包括通过 SSH 连接以终止旧流并开始新流。这有效,但并不漂亮。我想要我妈妈或女朋友可以使用的东西。我决定构建一个 HTML5 应用程序,通过 CGI 脚本发出频道切换。我目前有一个父进程,它调用一个子进程来决定流是否正在运行,然后是一个子进程来实际调整流。

当我从我的计算机流式传输实时视频时,我需要子进程无限期地运行。不幸的是,当我的父进程完成时,子进程中启动的后台进程似乎终止了。

我尝试了一个简单的 &,使用 nohup、setsid 和守护进程。守护进程运行最干净,但在父进程完成时仍会终止。即使带有 -r 标志。我将把我的代码放在下面,也许有人会对我如何实现这个或更好的方法来实现同样的事情有一个想法?谢谢!(哦,我知道杀死 vlc 不是杀死流的好方法,如果你有更好的方法,我全神贯注)

parent invoking child:
----------------------
./ChangeChannel.sh $channel     #passed from form submission


child (ChangeChannel.sh):
-------------------------
#!/bin/bash

directory=./Channels/
newchannel=$1

if [ $(pidof vlc) ]
    then
        sudo kill $(pidof vlc)
fi
daemon -r -v -d $directory$newchannel &


subchild example:
-----------------
vlc atsc://frequency=605029000 --intf=dummy --sout-transcode-audio-sync :live-cache=3000 --sout='#transcode{vcodec=h264,vb=150,fps=25,width=480,scale=1,venc=x264{aud,profile=baseline,level=30,keyint=15,bframes=0,ref=1},acodec=aac,ab=40,channels=2,samplerate=22050}:duplicate{dst=std{mux=ts,dst=-,access=livehttp{seglen=16,delsegs=true,numsegs=10,index=/var/www/stream/live.m3u8,index-url=content/live-######.ts},mux=ts{use-key-frames},dst=/var/www/stream/content/live-######.ts,ratecontrol=true}}'

我怎样才能防止子孩子终止???在 Ubuntu 12.04 上运行 Apache

4

1 回答 1

1

我得到了它!

对于任何对如何感兴趣的人,我改变了我的策略,使用 nohup、&、disown 和 > /dev/null 2>&1。

老实说,我仍然不太确定它是如何工作的……只是通过一些有根据的猜测进行了大量的试验和错误。我的代码如下:

parent invocation:
------------------
nohup ./ChangeChannel.sh $channel & disown


child invocation:
-----------------
sudo nohup su user $directory$newchannel &> /dev/null 2>&1


subchild invocation:
--------------------
vlc atsc://frequency=605029000 --intf=dummy --sout-transcode-audio-sync :live-cache=3000 --sout='#transcode{vcodec=h264,vb=150,fps=25,width=480,scale=1,venc=x264{aud,profile=baseline,level=30,keyint=15,bframes=0,ref=1},acodec=aac,ab=40,channels=2,samplerate=22050}:duplicate{dst=std{mux=ts,dst=-,access=livehttp{seglen=16,delsegs=true,numsegs=10,index=/var/www/stream/live.m3u8,index-url=content/live-######.ts},mux=ts{use-key-frames},dst=/var/www/stream/content/live-######.ts,ratecontrol=true}}' & disown

ChangeChannel.sh 使用 sudo 通过 cgi 执行 su,以便以 root 以外的用户身份执行 vlc。看起来有点乱,但它确实有效。

于 2012-08-29T05:08:19.853 回答