Windows に Mirakurun + BonRecTest + Rivarun を導入する

テレビチューナが刺さっているマシンが Windows だったという都合上、 Spinel + RecTest を使ってこれまで TS ストリームを解析処理していたのだけれど、いちいち GUI が重かったり Spinel はソースコードが公開されていないのでプロトコルハックするかと思ったら出来なかったりで困っていたけど Mirakurun + BonRecTest + Rivarun を使うように変更したらだいぶ良い感じになった。

Mirakurun 自体の説明は kanreisa さんの記事を読むと良い。

Windows に Mirakurun を導入するのは 2 つ目の yanoshi さんの記事を読むと良いんだけど、これは BonDriverProxy_Ex を使って TVTest に繋いだり Chianchu を動かしているのが別の Linux サーバだったりで結構複雑で、まあ録画機一式を作るには良いけど、もっとプリミティブに Mirakurun を Windows にいれて使う方法を書こうと思います。

BonRecTest のビルド

Mirakurun はチューナドライバにアクセスする手段を持ってはいなくて、 Linux だと recpt1 を使うのだけど Windows だと BonRecTest が使えます。

VisualStudio が必要ですが、現代は Community Edition があるので無償で利用することが出来ます。

Node.js のインストール

5.9.0 以上が必要らしいので Current とか入れておきましょう。

Mirakurun のインストール

管理者権限の PowerShell が必要です。

npm install winser -g
npm install mirakurun -g --production

Windows に入れた Mirakurun は Linux/Darwin 版と違い CLI から Mirakurun を操作することは出来ません。サービスの操作は Windows サービスから Mirakurun を探して start/stop/restart しましょう。またチューナの操作は Rivarun 経由で行なうことが出来ます。

設定ファイルは C:\Users\%username%\.Mirakurun にありますが、これは yanoshi さんの gist を参考にすると良いでしょう。

注意すべきは tuners.yml ですが、自分の環境にあった Path やデバイス名に書き換えると良いでしょう。

Windows ファイアウォールが有効になっているはずなので、 Node.js の exe ファイルをホワイトリストに入れておきましょう (すべて 1 台のマシンで完結する場合はこの限りではありません) 。また Mirakurun は認証が無いため、このマシンをインターネット上からアクセスできる場所に配置していると非常に危険です。そもそもそんな使い方をする人がいるのか分かりませんが、注意しましょう。

Rivarun のインストール

こっちは管理者権限無くても大丈夫。

npm install rivarun -g
rivarun [--b25] [--mirakurun host] [--priority priority] [--sid SID] [--ch type/channel] rectime destfile

管理者権限のある PowerShell 経由だと server.yml を読んで良い感じに繋がるのですが、一般権限だと --mirakurun を使って HTTP 経由でないと上手く動きません。以下のようにすると上手く行きました。

rivarun --mirakurun localhost:8888 ....

これで Mirakurun + BonRecTest + Rivarun の完成です、お疲れ様でした。

ffmpeg でリアルタイムエンコードする

いままでは RecTest の UDP 機能で送出した TS ストリームを ffmpeg で受けてリアルタイムにエンコードしていたのですが、 Rivarun からの標準入力で ffmpeg にデータを渡すことが出来ます。

Ruby の Open3 を使ったので CLI 上だと動くかよく分かりませんが、以下のようにすることで ffmpeg でリアルタイムエンコードは以下のように行なえます。

Open3.pipeline_r(
    ['rivarun', '--b25', '--mirakurun', 'localhost:8888', '--sid', sid, '--ch', ch, '-', '-'], 
    [ffmpeg_path, '-i', 'pipe:0', '-map', '0:0', '-map', '0:1',
    '-acodec', 'copy','-vcodec', 'copy',
    output_path])