はじめに
Windowsで、EDCB環境は構築済ですが、Mirakurun を試しに使ってみたいと思いました。
いろいろ問題があったのでまとめました。
課題・前提条件
WSL2はPCI/PCIeデバイスの直接認識(PCIパススルー)に対応していないため、Linux版PT2/PT3ドライバーをWSL2内で直接叩くことはできない。
解決アプローチ
役割分担構成: ハードウェア制御(チューナー・BonDriver)はWindowsホスト側に任せ、WSL2上のMirakurunへTSストリームを転送する。
WSL2 Interoperability(相互運用): WSL2からWindowsの .exe が直接起動できる仕組みを活用し、管理や起動プロセスをシンプルにまとめる
一般的な構成
一般的には、以下の様な構成を考えるようです。
[ PT2 / PT3 (PCI/PCIe) ]
│
(Windows Host / C:\)
├─ PT2/PT3 ドライバー & SDK
├─ BonDriver (BonDriver_PT2-ST.dll 等)
└─ BonDriverProxyEx.exe ◄─── WSL2から直接起動 / 常駐
│ (TCP/1192)
(WSL2 / Ubuntu)
├─ recpt1 (BonDriverProxyクライアント対応版)
└─ Mirakurun (Node.js / systemd)
│ (HTTP/40772)
[ EPGStation など ]
ネットワークで仲介する仕組みが必要です。
Windows側に常駐サービスも必要になり面倒。
今回とった構成
WSL2上からBonRecTest.exe をInteroperability機能で直接呼び出せば、TSストリームを標準出力(stdout)へ履き出させることができます。
一見、常識的ではないですが、RPCを裏で行って標準出力を繋ぐという機能をWSL2が標準で持っていることを利用します。
[ PT2 / PT3 (PCI/PCIe) ]
│
(Windows Host / C:\)
├─ PT2/PT3 ドライバー & SDK
├─ BonDriver (BonDriver_PT2-ST.dll 等)
└─ BonRecTest.exe ◄─── WSL2のMirakurunから直接プロセス呼び出し
│ (標準出力 / Pipe)
(WSL2 / Ubuntu)
└─ Mirakurun (Node.js / systemd)
│ (HTTP/40772)
[ EPGStation など ]
Mirakurun のインストール
現在は、Docker が推奨で、個別のインストールはサポート外になってます。
特に、Ver 4.0 以降では、Docker で必要な機能以外はいくつか削られているようです。
それでも、WSL2にわざわざDockerを載せる気はならないので、素直にそのまま npm でインストールしています。
# Ubuntu環境を最新に
$ sudo apt update && sudo apt upgrade -y
# Node.js とビルドに必要な基本ツール、PCSC(カードリーダー用ライブラリ)の導入
$ sudo apt install -y nodejs npm build-essential libpcsclite-dev libssl-dev pkg-config
# Node.js は v.22以上が必要
$ node -v
v22.22.1
$ sudo npm install mirakurun pm2 -g --unsafe-perm
起動は、とりあえずpm2を使わず、手動で行います。
$ cd /usr/local/lib/node_modules/mirakurun
$ sudo npm start
暫くして、
http://127.0.0.1:40772/
へブラウザでアクセスして画面が表示されればOKです。
チューナーの設定
設定ファイルを編集します。
ここでは、Windows側は c:\tools\PT2\BonRecTest\ に必要なファイルを置いた場合です。
$ sudo vi /usr/local/etc/mirakurun/tuners.yml
- name: PT2-T1
types:
- GR
command: /mnt/c/Windows/System32/cmd.exe /C 'c:\tools\PT2\BonRecTest\runBonRecTestT.bat <channel> '
decoder:
isDisabled: false
チューナーの数だけ記述します。
cmd.exe のパスと'...'内のパスの書き方が違うので注意します。
BonRecTest.exe を直接呼び出さず、バッチファイルにしてあります。
こうしておくことで、Mirakurun側の設定を触らずにデコードの有無やログ出力、引数の調整をWindows側だけで完結できるのがメリットです。
デコードをどこで行うか
TSのスクランブルの解除をどこで行うかも大きな問題です。
Windows側、WSL2側、どちらでも可能です。
既にWindows側にある場合、これを使わない手はないでしょう。
つまり、バッチ内では、
BonRecTest.exe --decoder B25Decoder.dll --driver BonDriver_PT-T.dll --output - --channel %chno%
と書いています。
chno はローカル変数ですが、Mirakurun から渡された<channel> の値です。
--output -は、BonRecTest での標準出力に書き出すオプションです。
softcas 使用時の問題
B-CASを使えば問題ないでしょう。
たまたま softcas を使っていたので WSL2 特有のトラブルに遭遇しました。
通常、exe と同じディレクトリに置いた WinScard.dll(softcas) は先に読み込まれます。
しかし、実際には System32 の本物の WinScard.dll が読み込まれてしまいます。
カレントディレクトリや、Path を変えても効果はありません。
WSL2 からの実行では同じ名前の dll は 安全な DLL 検索モード に従ってロードされるようです。
単純な回避策は、違う名前にするしかありません。
今回は、バイナリパッチで逃げてしまいましたが、B25Decorder の"WinScard"の名前を修正して再ビルドするのが正当な方法です。
動作確認のポイント
全てが一度にうまくいく事など、ほとんどありません。
まずは、Mirakurun 抜きで、ちゃんと TSストリームが吐き出されるかを確認します。
Windows 側に必要なファイルは1つのディレクトリに置きます。
PT2 での例です。PT3 ではファイル名は違いますが同じ構成です。
.
├─ B25Decoder.dll
├─ BonDriver_PT-S.ChSet.txt
├─ BonDriver_PT-S.dll
├─ BonDriver_PT-ST.ini
├─ BonDriver_PT-T.ChSet.txt
├─ BonDriver_PT-T.dll
├─ BonRecTest.exe
├─ PTCtrl.exe
└─ (WinTCard.dll) *softcas(B-CASを使うなら不要)
- Windows 側で再生可能なTSファイルを得る
- WSL2 側で再生可能なTSファイルを得る
Windows で以下を実行してみます。(14=NHK総合)
BonRecTest.exe --decoder B25Decoder.dll --driver BonDriver_PT-T.dll --output test.ts --channel 14
できた、TSファイル(test.ts)をVLCプレイヤー等で再生できればOKです。
同様に、WSL2 側からも作成できる事を確認します。
# Windows のディレクトリへ移動
$ cd /mnt/c/tools/PT2/BonRecTest
$ ./BonRecTest.exe --decoder B25Decoder.dll --driver BonDriver_PT-T.dll --output test.ts --channel 14
チャンネルスキャン
Mirakurun を起動してWEBブラウザで表示します。
設定画面に、チャンネルスキャンがあります。
チャンネル情報もチューナーと同様に設定ファイル(channels.yml)でも編集できますが、役割が違います。
チャンネルスキャンを実行すると現在設定されている情報に対して追加・更新が行われます。
完了すると、設定を保管するように促されます。
行っているのは、論理チャネルを全部総なめしているようです。
地デジであれば、13~63チャンネルまで全部スキャンしてTSストリームを調べていきます。
うまく解析できたチャネルが登録されます。
ですので、設定ファイルを直接修正する意味はほとんどありません。
PT2/3 での落とし穴
NHK総合は、関東圏では 27ch という認識がありますが、PT2/3 では必ずしも 27 という訳ではありません。チューナーによって物理チャンネルが異なります。
この対応については、BonDriver_PT-T.ChSet.txt の内容を見て下さい。
「チャンネル」と「BonDriverとしてのチャンネル」が違います。
BonRecTest では、後者を指定しないと正しい選局になりません。
手っ取り早い方法は、バッチ側で変換してしまう事です。
こんなバッチが考えられます。
@rem 地デジ(GR)用のPT1/2のMirakurunからの起動バッチ(CP932)
@echo off
cd %~dp0
set chno=
if "%1"=="" goto exit1
rem 論理チャンネルからBonドライバーのチャネル番号に変換
if "%1"=="13" set chno=0
if "%1"=="14" set chno=1
if "%1"=="15" set chno=2
if "%1"=="16" set chno=3
if "%1"=="17" set chno=4
if "%1"=="18" set chno=5
if "%1"=="19" set chno=6
if "%1"=="20" set chno=7
if "%1"=="21" set chno=8
if "%1"=="22" set chno=9
if "%1"=="23" set chno=10
if "%1"=="24" set chno=11
if "%1"=="25" set chno=12
if "%1"=="26" set chno=13
if "%1"=="27" set chno=14
if "%1"=="28" set chno=15
if "%1"=="29" set chno=16
if "%1"=="30" set chno=17
rem 63 まであるが省略
echo %date% %time% %1 → %chno% >> runBonRecTestT.log
BonRecTest.exe --decoder B25Decoder.dll --driver BonDriver_PT-T.dll --output - --channel %chno%
:exit1
これらを修正後、チャンネルスキャンを実行すれば、自動で変更されます。
Mirakurun を再起動後、番組情報が取得されます。
おわりに
Mirakurun が Linux 環境では定番ということで、どんな感じなのか見てみたかったものです。
安定した録画環境を構築したかった訳ではありませんので、あえて Docker は使いませんでした。

