• PLEX系チューナーのドライバであるnns779/px4_drvがWindows対応した(最高すぎる)のでHyper-V Serverで動かしたメモです
  • 公式ドライバはBDAドライバに依存するのでWindowsServerでは動きませんが、px4_drv版はWinUSBで依存なく直接操作するので問題なく動きました(最高)

前提条件

  • チューナーはPX-W3PE5 1枚のみ
  • OSはHyper-V Server 2019
  • 物理サーバはHPE Proliant Microserver Gen10 Plus
  • ICカードリーダーはROCKETEK RT-SCR3
    • 中身はAlcor Micro AU9540らしい

下準備

  • 以降のコマンドはすべてPowerShellで実行する
  • コマンドプロンプトのウィンドウでstart powershellすればPowerShellウィンドウが開く
# エクスプローラー等をインストールして再起動
Add-WindowsCapability -Online -Name ServerCore.AppCompatibility~~~~0.0.1.0
Restart-Computer

# 作業ディレクトリの作成
mkdir C:\DTV
mkdir C:\DTV\bin
mkdir C:\DTV\work
mkdir C:\DTV\work\inf

# 以降の作業は全てworkで行う
cd C:\DTV\work

# px4_drvのdevelopブランチをダウンロードしてくる
# 以前はwinusbブランチだったがマージされた
Invoke-WebRequest https://github.com/nns779/px4_drv/archive/refs/heads/develop.zip -OutFile px4_drv.zip
Expand-Archive -Path .\px4_drv.zip -DestinationPath .\

ドライバの署名

  • 起動時にF8連打して「ドライバー署名の強制を無効にする」を使う場合は不要
# Windows Driver Kitのダウンロードとインストール(Inf2Cat.exeを使うためだけに入れる)
Invoke-WebRequest https://go.microsoft.com/fwlink/?linkid=2166289 -OutFile wdksetup.exe
.\wdksetup.exe

# infにCatalogFileの定義を加えて別ディレクトリに入れる
# ディレクトリ分けるのはInf2Catの引数でディレクトリを指定する必要があるため
Get-Content .\px4_drv-develop\winusb\pkg\inf\pxw3pe5_winusb.inf |
  ForEach-Object { $_.Replace("[Version]","[Version]`r`nCatalogFile.NTAMD64 = pxw3pe5_winusb.cat") } |
  Set-Content .\inf\pxw3pe5_winusb.inf

# カタログファイルを作る
& 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\Inf2Cat.exe' /os:ServerRS5_X64,Server2016_X64 /driver:.\inf\
# .catができてるはず
dir .\inf

# 自己署名証明書を作ってTrustedPublisherに入れる
New-SelfSignedCertificate -Subject "CN=px4SelfSigned" -TestRoot -Type CodeSigningCert -CertStoreLocation Cert:\LocalMachine\My\ -NotAfter (Get-Date).AddYears(10) |
  Move-Item -Destination Cert:\LocalMachine\TrustedPublisher\
# 証明書はGet-ChildItemで見れる。-TestRootを付けたのでIssuerはCertReq Test Rootになっているはず
Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher\ | Format-List
# CertReq Test Rootを信頼されたルート証明機関にする
Get-ChildItem -Path Cert:\LocalMachine\CA\ -DnsName "CertReq Test Root" |
  Move-Item -Destination Cert:\LocalMachine\Root\ 

# ドライバを署名する(署名するのはcatの方のみ)
$cert = Get-ChildItem -Path Cert:\LocalMachine\TrustedPublisher\ -CodeSigningCert -DnsName "px4SelfSigned"
Set-AuthenticodeSignature -FilePath .\inf\pxw3pe5_winusb.cat -Certificate $cert -TimestampServer http://timestamp.digicert.com/?alg=sha1

ドライバのインストール

  • devcon.exeがない場合は、devmgmtでデバイスマネージャーを起動して右クリックからハードウェア変更のスキャン
    • pnputil /scan-devicesとかで出来るらしいがHyper-V Serverでは未実装のオプションだった
  • エラーでレジストリ内の構成情報が不完全であるか、または壊れているためこのハードウェア デバイスを開始できません。となった場合は、以下を見つつレジストリのUpperFiltersのエントリを消すとうまくいくかもしれない
# 「PXW3PE5」が認識されていることを確認
Get-PnpDevice -FriendlyName *W3PE*
# ドライバインストール
pnputil /add-driver .\inf\pxw3pe5_winusb.inf /install
# 名前が「PLEX PX-W3PE5 ISDB-T/S Receiver Device (WinUSB)」に変わっているはず
Get-PnpDevice -FriendlyName *W3PE*
# StatusがOKになっていない場合、何かおかしいのでエラー内容を見つつデバイススキャンや上記URLのレジストリ操作を試す
Get-PnpDevice -FriendlyName *W3PE* | Format-List

# デバイスがいない場合はデバイスマネージャーの「ハードウェア変更のスキャン」相当をしてみる
& "C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe" rescan

px4_drvのWinUSB版ビルド

# Build Tools for Visual Studio 2019を入れる
# ワークロードは「C++によるデスクトップ開発」をチェックする。右の方に「MSVC v142」のようにバージョンが書かれているので一応確認する
Invoke-WebRequest https://aka.ms/vs/16/release/vs_buildtools.exe -OutFile vs_buildtools.exe
.\vs_buildtools.exe

# Visual Studio 2019 Developer PowerShellに切り替える
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\Launch-VsDevShell.ps1"
# ビルド
MSBuild .\px4_drv-develop\winusb\px4_winusb.sln /t:clean /t:build /p:Configuration=Release /p:Platform=x64

# ビルドしたものを移動しておく
Copy-Item .\px4_drv-develop\winusb\build\x64\Release\BonDriver_PX4.dll ..\bin\BonDriver_PX4-T.dll
Copy-Item .\px4_drv-develop\winusb\build\x64\Release\BonDriver_PX4.dll ..\bin\BonDriver_PX4-S.dll
Copy-Item .\px4_drv-develop\winusb\build\x64\Release\DriverHost_PX4.exe ..\bin\

# 設定ファイルのコピー
Copy-Item .\px4_drv-develop\winusb\pkg\BonDriver_PX4\BonDriver_PX4-S.ChSet.txt ..\bin\
Copy-Item .\px4_drv-develop\winusb\pkg\BonDriver_PX4\BonDriver_PX4-T.ChSet.txt ..\bin\
Copy-Item .\px4_drv-develop\winusb\pkg\BonDriver_PX4\BonDriver_PX4-S.ini ..\bin\
Copy-Item .\px4_drv-develop\winusb\pkg\BonDriver_PX4\BonDriver_PX4-T.ini ..\bin\
Copy-Item .\px4_drv-develop\winusb\pkg\DriverHost_PX4\DriverHost_PX4.ini ..\bin\

# firmware抽出用のファイルもコピー
Copy-Item .\px4_drv-develop\winusb\build\x64\Release\fwtool.exe .\
Copy-Item .\px4_drv-develop\fwtool\fwinfo.tsv .\

firmwareの抽出

# 公式ドライバをダウンロードして展開
Invoke-WebRequest -Uri http://plex-net.co.jp/download/pxq3u4v1.2.zip -OutFile pxq3u4v1.2.zip
Expand-Archive -Path .\pxq3u4v1.2.zip
# firmware抽出
.\fwtool.exe .\pxq3u4v1.2\x64\PXQ3U4.sys ..\bin\it930x-firmware.bin

libaribb25のビルド

# ソースコードのダウンロードと展開
Invoke-WebRequest https://github.com/epgdatacapbon/libaribb25/archive/refs/heads/master.zip -OutFile libaribb25.zip
Expand-Archive -Path .\libaribb25.zip -DestinationPath .\

# ビルド。WindowsTargetPlatformVersionとPlatformToolsetの値は導入したBuild Toolsの年度によって違う
# https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2019#desktop-development-with-c
MSBuild .\libaribb25-master\arib_std_b25.sln /t:clean /t:build /p:Configuration=Release /p:Platform=x64 /p:WindowsTargetPlatformVersion=10.0.19041.0 /p:PlatformToolset=v142

# リネームしつつ移動
Copy-Item .\libaribb25-master\x64\Release\libaribb25.dll ..\bin\B25Decoder.dll
  • 以降はDeveloper PowerShellではなく普通のPowerShellでもいい

BonRecTestのダウンロードとテスト実行

# ダウンロードして展開
Invoke-WebRequest https://github.com/rndomhack/BonRecTest/releases/download/v1.0.0/BonRecTest_v1.0.0.zip -OutFile BonRecTest_v1.0.0.zip
Expand-Archive -Path .\BonRecTest_v1.0.0.zip
# 移動
Copy-Item .\BonRecTest_v1.0.0\x64\BonRecTest.exe ..\bin\

# テスト実行。10秒ぐらい待って何も出なければCtrl+cで止める
# output.tsのファイルサイズが膨らんでいればOK
# CreateFileW() failed.が出た場合、無視して進めてEPGStation経由なら動くかもしれない
..\bin\BonRecTest.exe --driver BonDriver_PX4-T.dll --output output.ts --channel 14 --decoder B25Decoder.dll

Node.jsとmirakurunのインストール

# Node.jsインストール。設定は全部デフォルトで入れる
Invoke-WebRequest https://nodejs.org/dist/v14.17.3/node-v14.17.3-x64.msi -OutFile node-v14.17.3-x64.msi
./node-v14.17.3-x64.msi
# インストール先にPATH通したのを反映するため一旦logoffしてもう一回入る
logoff
# カレントを戻す
start powershell
cd C:\DTV\work

# Mirakurunインストール
npm install --global winser@1.0.3
npm install --global --production mirakurun@latest
# バージョン情報が返ってくるか試す
Invoke-RestMethod http://localhost:40772/api/status
# configはユーザープロファイルに入っているのでよしなに設定する
# tunersは下に書いたサンプル通りでいいはず
notepad C:\Users\Administrator\.Mirakurun\tuners.yml
# channelsは地域に合わせて
notepad C:\Users\Administrator\.Mirakurun\channels.yml
# serverはそのままでいいはず
# 手元環境では録画の先頭が切れたので maxBufferBytesBeforeReady: 16777216 (初期値の倍)とか設定した
notepad C:\Users\Administrator\.Mirakurun\server.yml
# 設定したらmirakurun再起動
Restart-Service mirakurun

# Windowsのファイアウォールで40772を許可する
New-NetFirewallRule -Name Mirakurun-In-TCP -DisplayName "Mirakurun (TCP 受信)" -Direction Inbound -LocalPort 40772 -Protocol TCP -RemoteAddress 192.168.0.0/16 -Program %PROGRAMFILES%\nodejs\node.exe -Action Allow
  • tuners.ymlはこんな感じ
- name: PX4-T1
  types:
    - GR
  command: C:\DTV\bin\BonRecTest.exe --driver BonDriver_PX4-T.dll --decoder B25Decoder.dll --output - --space <space> --channel <channel>
- name: PX4-T2
  types:
    - GR
  command: C:\DTV\bin\BonRecTest.exe --driver BonDriver_PX4-T.dll --decoder B25Decoder.dll --output - --space <space> --channel <channel>
- name: PX4-S1
  types:
    - BS
    - CS
  command: C:\DTV\bin\BonRecTest.exe --driver BonDriver_PX4-S.dll --decoder B25Decoder.dll --output - --space <space> --channel <channel>
- name: PX4-S2
  types:
    - BS
    - CS
  command: C:\DTV\bin\BonRecTest.exe --driver BonDriver_PX4-S.dll --decoder B25Decoder.dll --output - --space <space> --channel <channel>
  • 他のPCから http://<ip_address>:40772/ を開きMirakurunのWebUIが開けばOK
  • EPGStaionやChinachuなどは適当にHyper-V上の仮想マシンで構築する

起動時にデバイススキャンする

# 起動時にタスクを起動するトリガー
$trigger = New-ScheduledTaskTrigger -AtStartUp
# devconを起動するアクション
$action = New-ScheduledTaskAction -Execute "C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe" -Argument "rescan"
# Administratorで起動する
$principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount
# タスク登録
Register-ScheduledTask -TaskName "RescanDevice" -Trigger $trigger -Action $action -Principal $principal

再起動して不調になった時にやることメモ

  • まずはテスト実行
    • C:\DTV\bin\BonRecTest.exe --driver BonDriver_PX4-T.dll --output C:\DTV\bin\output.ts --channel 14 --decoder B25Decoder.dll
  • チューナーが見つからない、的なエラー
    • devmgmtハードウェア変更のスキャン
  • px4::DeviceBase::DeviceBase: CreateFileW() failed.BonDriver::OpenTuner: WaitForSingleObject() failed.
    • 原因わからず、しばらく待ってみたら(10分以上)解消したこともある
    • この状態でもmirakurunのEPG情報は取れていたり、EPGStation経由で見れたりする
    • 2021/09/01時点のdevelopブランチの最新版をビルドして差し替えたら直った感じがする
  • mirakurunのWebUIが開かない
    • Restart-Service mirakurun