それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

sshでパイプして vlc でテレビ番組TSを再生する

テレビを再生するだけなら 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 ) というWindowsLinuxとして使える mingw 類似環境があるのでそれを使えばいいわけで。

windowsvlc は 標準入力で再生できる

wsl 
cat test.ts | vlc fd://0

これをssh 経由ですればいいわけですね

wsl
ssh server recpt1 --b25 --strip 103 --sid 101 3600 - | vlc.exe fd://0

vlcwindows だと 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 の練習にちょうどよかった。