テレビを再生するだけなら sshで十分
BONDriverだとか bon proxy だとか、TVTestだとか、Windowsの人たちってパイプを使わないので面倒くさいことしてるなぁと思う。
面倒くさいことをするので、使うのがめんどくさくなるんだよ。サクッと使えるようにしておけばいいじゃん。
テレビを見てストリーミングするだけなら、vlc に 標準入力で渡せばいいじゃん?
だって、TSだよ?転送用だよ?ネットワークそのまま流せるんだよ?tsって transport stream だよ?転送用パケットストリームだよ?
ssh 経由でTSを流す。
ssh で recpt1 起動して vlc 再生できるじゃん?
ssh server 'recpt1' | vlc -
windowsでも同じ様にする
Windowsには、wsl1(wsl v1 ) というWindowsとLinuxとして使える mingw 類似環境があるのでそれを使えばいいわけで。
wsl cat test.ts | vlc fd://0
これをssh 経由ですればいいわけですね
wsl ssh server recpt1 --b25 --strip 103 --sid 101 3600 - | vlc.exe fd://0
vlc は windows だと fd://0
で標準入力からデータを受け取れる。
sshは wsl でパイプを扱える。wsl は Windowのコマンドにパイプを渡せる。だから vlc 標準入力に突っ込めばいい。面倒くさい通信やプロトコルなんて考える必要がない。
wsl2 だとHyperVに閉じ込められてるので多分できない。 mingw/cygwin でもできる。
バックグラウンドで起動するには、bash をバックグラウンド起動してexec/fork しちゃえばいい
bash -c "$cmd" &
これで、bash からsshバックグラウンド起動してvlc に流すってことだ。
例えばこんな感じ
#!/usr/bin/env bash function channel(){ curl -s http://server-01.lan/epgrec/show_channels_json.php } function search_channel(){ channel | jq '[.[]|select( .name|test($KEY))]' --arg KEY $1 } function vlc_path(){ printf "%q" "$(wslpath 'C:/Program Files/VideoLAN/VLC/vlc.exe')" } function start_play(){ channel=$1 duration=$2 sid=$3 vlc=$(vlc_path) cmd="ssh server-01.lan recpt1 --b25 --strip --sid $sid $channel $duration - | $vlc fd://0 2>/dev/null 1>/dev/null" echo $cmd bash -c "$cmd" & 2>/dev/null 1>/dev/null } function main(){ ret=$(search_channel $1) if [[ $( echo $ret | jq 'length') != 1 ]];then #echo $ret | jq echo $ret | jq -r '.[].name' exit 1; fi echo $ret | jq -r '.[]| { name: .name, channel: .channel }' channel=$( echo $ret | jq -r '.[].channel') sid=$( echo $ret | jq -r '.[].sid') dur=3600 if [[ ! -z $2 ]]; then dur=$2 fi start_play $channel $dur $sid } main $@;
チャンネル一覧は、webに設置して curl で取得してるけど、ssh経由でとってきてもいいかもしれない。
次のようなjson を用意して、そのファイルを jq でパースして再生コマンドを作ってしまうということで。
[ { "channel": "101", "name": "NHK BS1", "sid": "101", }, { "channel": "103", "name": "NHK BSプレミアム", "sid": "103", }, ]
ちょうど、jq の使い方のサンプルが欲しかったので、jq の練習にちょうどよかった。