2

私は、パーソナルコンピューターからHTTPライブストリーミングをサポートするデバイス(iOSデバイスと一部のAndroidを考えてください)にHDTVをストリーミングするプロジェクトに取り組んでいます。私はビデオのフォーマットとストリーミングの側面を持っています。私が今実装しようとしているのは、チャネルをリモートで変更する簡単な方法です。

私の現在の方法では、SSH経由で接続して古いストリームを強制終了し、新しいストリームを開始します。これは機能しますが、きれいではありません。お母さんや彼女が使えるものが欲しいです。CGIスクリプトを介してチャネル切り替えを発行するHTML5アプリを作成することにしました。現在、ストリームが実行されているかどうかを判断するために子プロセスを呼び出し、次に実際にストリームを調整するためにサブ子プロセスを呼び出すフォームを持つ親プロセスがあります。

コンピューターからライブビデオをストリーミングしているので、サブチャイルドプロセスを無期限に実行する必要があります。残念ながら、私の親プロセスが終了すると、サブ子プロセスで開始されたバックグラウンドプロセスが終了するようです。

nohup、setsid、daemonを使用して、単純な&を試しました。デーモンは最もクリーンに実行されますが、親が終了すると終了します。-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}}'

サブチャイルドが終了しないようにするにはどうすればよいですか?Ubuntu12.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 は root 以外のユーザーで vlc を実行するために、sudo を使用して cgi 経由で su を実行します。少し乱雑に見えますが、うまくいきます。

于 2012-08-29T05:08:19.853 に答える