coaxは、チューナーを制御してストリームを取得するソフトウェアです。 USB(WinUSB、IOKit、usbfs)、Linux DVB API、Windows BDAといったOSごとの違いを内側で吸収し、どのプラットフォームでも同じ方法で選局とストリーミングができます。
coaxは2つのプログラムに分かれています。
チューナーとやり取りするのは、チューナーを管理するデーモンのcoaxdだけです。
クライアントCLIのcoaxはチューナーを直接制御せず、HTTPでcoaxdに選局を要求し、ストリームを受け取ります。
BonDriver実装のBonDriver_coaxやGUIのZeroWaveも同じです。
| プログラム | 役割 |
|---|---|
coax |
クライアントCLI。list、tune、scan、export、cardの各サブコマンドを持ち、ハードウェアを直接制御しない |
coaxd |
チューナーホスト(デーモン)。チューナーを制御し、クライアントに貸し出す。チューナーもカードリーダーも1つのHTTP APIで提供する |
BonDriver_coax |
TVTestとEDCBのためのBonDriver。内蔵カードスロットをPC/SCで使うためのwinscard.dllと、TVTestプラグインを同梱 |
fwextract |
メーカー配布のドライバーパッケージからファームウェアを取り出す補助ツール |
| ZeroWave | GUIクライアント |
普段はデーモンの存在を意識する必要はありません。
coaxdが動いていなければcoaxなどのクライアントが起動し、誰も使わなくなればcoaxdは自動で終了します。
デーモンの動作の詳細はtuner-host.mdにあります。
- 選局とストリーミング:ISDB-T、ISDB-C、ITU-T J.83 Annex B、ISDB-S、ISDB-S3に加え、Linux DVB APIで表現できるDVB-T/T2、DVB-S/S2なども選局できます。
- チャンネルとサービスのスキャン:
coax scan --discoverは、内蔵の周波数リストを順に選局してNITを読み、その網のチャンネルを自動で組み立てます。定義ファイルを用意する必要はありません。PAT、NIT、SDTからサービス、Stream ID、ONIDを取り出します。周波数が事業者ごとに違うケーブルなどには、DVBv5形式のチャンネル定義ファイルも渡せます。 - TSMFとTLVの解析:1本の搬送波に複数のストリームがTSMFで多重されているときは、ヘッダーを読んでスロットごとに分け、それぞれの種別(TSかTLVか)とTSID、サービスを並べます。TLVは、パケット境界、IPv4/IPv6とヘッダー圧縮IP、UDP、MMTPヘッダー、分割や集約されたMMTシグナリング、TLV-NIT、MH-SDTまで解析します。TSMFに載ったTLVもPID
0x2dからバイト列を組み直して同じ解析にかけます。 - スキャン結果のエクスポート:スキャン結果をMirakurunの
channels.yml、DVBv5 conf、BonDriver ChSet、TVTest ch2、EDCB ChSet4/5へ変換します。 - カードリーダー:カードスロットを内蔵したチューナーなら、そのスロットをPC/SCソケット経由で使えます(card-reader.md)。
coaxdは、直接USB、chardev(px4_drv)、pt3とpt1、dvb(Linux DVB)、bda(Windows BDA)という複数のバックエンドを同時に持ち、見つかったチューナーを1つの一覧にまとめます。
そのため、coaxが個別に対応していないチューナーも使えます。
LinuxならLinux DVB API(/dev/dvb)、WindowsならBDAを通して、すでに入っているドライバーをそのまま使います(recpt1や製品ごとのBonDriverは不要です)。
coaxが個別に対応しているUSBチューナーは、放送用のドライバーを使わず、USBデバイスを直接制御します。 使うのはLinuxのusbfs、WindowsのWinUSB、macOSのIOKitで、どれもOSに元から入っているものです。 同じチューナーが、WindowsでもLinuxでもmacOSでも同じように動作します。
| ハードウェア | 例 | 通る経路 |
|---|---|---|
| USB接続のチューナー | PLEX PX-W3U4、PX-S1UR、PX-W3U3、MyGica T230、KEIAN KTV-FSUSB2、TBS 5520SE、Sony CECH-ZD1 J | 直接USB。Linux、Windows、macOSのいずれでも動きます |
| PCIe接続のチューナー | Earthsoft PT3、PLEX PX-W3PE5、PX-MLT5PE、Digital Devices Max M4やPT4K(TBS6812)、その他TBSのPCIeカード | Linuxはpx4_drvやLinux DVB、Windowsは直接USBか、coaxdがカードを直接制御する経路 |
| coaxが対応していないチューナー | Linux DVBかBDAのドライバーがあるもの(一部の機能は使えません) | Linuxはdvb、Windowsはbda |
対応表と例外はbackends.mdにあります。
flowchart TB
subgraph client["クライアント"]
cli["coax(CLI)・ZeroWave(GUI)"]
bon["BonDriver_coax.dll"]
end
subgraph host["チューナーの制御と管理"]
coaxd["coaxd"]
end
subgraph driver["ドライバー"]
usb["直接USB(usbfs / WinUSB / IOKit)"]
dvb["Linux DVB(/dev/dvb)"]
chardev["px4_drv / pt3 / pt1"]
bda["Windows BDA"]
end
subgraph hardware["ハードウェア"]
usbtuner["USBチューナー"]
pcie["PCIeカード"]
generic["coaxが対応していないチューナー"]
end
cli -->|HTTP| coaxd
bon -->|HTTP| coaxd
coaxd --> usb
coaxd --> dvb
coaxd --> chardev
coaxd --> bda
usb --> usbtuner
chardev --> usbtuner
chardev --> pcie
dvb --> pcie
dvb --> generic
bda --> pcie
bda --> generic
クライアントはHTTPで選局を要求し、同じ接続でTSを受け取ります。
coaxdはチューナーを開いて選局し、受信したTSをその接続へ転送するだけです。
接続が閉じることがチューナーの解放そのものなので、解放の手続きは不要です。
どのドライバーを通るかは、チューナーごとのバックエンドで決まります。 既存のソフトウェアとの関係はstack.mdにあります。
Go 1.25以降が必要です。
coaxもcoaxdも、Linux、Windows、macOSでCGO_ENABLED=0のままビルドできます(getting-started.md)。
go build -o coax ./cmd/coax
go build -o coaxd ./cmd/coaxd # 同じディレクトリに置くと coax が自動で起動します
./coax version # coax 0.1.1USB接続のチューナーも、PCIeカードも、OSのドライバー経由のチューナーも、coaxdが同じ形にそろえて1つの一覧に並べます。
一覧を作るときにボードは開かないので、他のプログラムが使っているチューナーにも影響しません。
次はWindowsの例で、US-3POUT(USB)、TBS 6205se、Earthsoft PT3(どちらもPCIe)が1台に挿さっています。
$ ./coax list
TUNER DELIVERY STATE MODEL
us3pout:p9-16:0 ISDB-T, ISDB-S free US-3POUT (TC90522 + MxL136 + TDA20142)
tbs:5e0c2a7f19d34b81:0 DVB-T, DVB-T2, DVB-C, ISDB-T, DVB-C/ANNEX_B, DVB-C/ANNEX_A free TBS 6205se Tuner 0
tbs:5e0c2a7f19d34b82:0 DVB-T, DVB-T2, DVB-C, ISDB-T, DVB-C/ANNEX_B, DVB-C/ANNEX_A free TBS 6205se Tuner 1
tbs:5e0c2a7f19d34b83:0 DVB-T, DVB-T2, DVB-C, ISDB-T, DVB-C/ANNEX_B, DVB-C/ANNEX_A free TBS 6205se Tuner 2
tbs:5e0c2a7f19d34b84:0 DVB-T, DVB-T2, DVB-C, ISDB-T, DVB-C/ANNEX_B, DVB-C/ANNEX_A free TBS 6205se Tuner 3
pt3:6-17-0-0:0 ISDB-S free Earthsoft PT3 satellite tuner 1
pt3:6-17-0-1:0 ISDB-S free Earthsoft PT3 satellite tuner 2
pt3:6-17-0-2:0 ISDB-T free Earthsoft PT3 terrestrial tuner 1
pt3:6-17-0-3:0 ISDB-T free Earthsoft PT3 terrestrial tuner 2
Tuners are named from what each board reports about itself.
Pass --tuners to open each board and confirm them.-oで書き出し先を指定します。
省略すると標準出力へ出力します。
./coax tune --system ISDBT --ch 27 -o ter27.ts # 地上デジタル27ch
./coax tune --ch BS15_1 -o bs.ts # 衛星(--ch 16625 でも同じチャンネル)止めるときはCtrl-CかSIGTERMを送ります。
接続が閉じることがチューナーの解放そのものなので、解放の手続きは不要です。
scanで結果をJSONに保存し、exportで各形式へ変換する2段です。
元になるのはJSONなので、書き出す形式や条件を変えてもスキャンし直す必要はありません。
./coax scan --discover --output scan.json # 受信できるチャンネルを探す
./coax export --input scan.json --output channels.yml # Mirakurun形式へ変換進捗は標準エラーへ出ます。 端末では最後の1行がその場で書き換わり、ファイルやパイプへリダイレクトすると候補ごとに1行ずつ出ます。 受信できたストリームは、サービスまで分かった時点で表示されます。
$ ./coax scan --ch 27
[1/1] [## ] 12% locking ISDBT/27 LOCK CNR 30.1dB (1.2s)
[1/1] [##### ] 25% sampling ISDBT/27 15.98 Mbps CNR 29.6dB (3.3s)
[1/1] [####################] 100% done ISDBT/27 found (ts, 4032224 bytes) 15.75 Mbps CNR 29.6dB (3.5s)
サンプル6 TSID=32000 ONID=32000
50000 サンプルテレビ1 (TV)
50001 サンプルテレビ2 (TV)
50007 サンプルテレビ臨時 (temporary video)
50384 サンプルテレビ (1seg)1本の搬送波に複数のストリームがTSMFで多重されていることがあります。 その場合はスロットごとに分けてスキャンします。
$ ./coax scan --discover ISDBC --route CATV --output scan.json
...
[46/113] [####################] 100% done ISDBC/C46 found (ts, 33400824 bytes) 29.17 Mbps CNR 32.9dB -56dBm (9.8s)
TSMF [#2 ts TSID=19001 ONID=4]
BS Digital TSID=19001 ONID=4
291 サンプルBS サンプル放送 (TV)
TSMF [#3 ts TSID=19003 ONID=4]
BS Digital TSID=19003 ONID=4
292 サンプルBS サンプルテレビ (TV)
...TLVのスロットは種別がtlvになります。
1波に収まっているものは、TLVを解析してサービスまで表示します。
$ ./coax scan --system ISDBC --ch C19 --route CATV
[1/1] [####################] 100% done ISDBC/C19 found (ts, 9914352 bytes) 38.81 Mbps CNR 33.5dB -52dBm (9s)
TSMF [#1 tlv TSID=45101 ONID=11]
195 サンプルBS 4K サンプル放送 (TV)1つのTLVストリームが複数の搬送波にまたがることもあります。 次の3波はどれも同じスロットを載せていますが、こちらはサービス名まで出ません。
[1/113] [####################] 100% done ISDBC/1 found (ts, 96112 bytes) CNR 33.5dB -51dBm (5.8s)
TSMF carrier 1/3
TSMF [#1 tlv TSID=45001 ONID=11]
[2/113] [####################] 100% done ISDBC/2 found (ts, 96112 bytes) CNR 33.9dB -49dBm (600ms)
TSMF carrier 2/3
TSMF [#1 tlv TSID=45001 ONID=11]
[3/113] [####################] 100% done ISDBC/3 found (ts, 96112 bytes) CNR 34.9dB -46dBm (600ms)
TSMF carrier 3/3
TSMF [#1 tlv TSID=45001 ONID=11]1波のサンプルからはTLVを組み直せないためです(解析の制限)。
スロットは--stream-idでそのまま選局できます(coax tune --system ISDBC --ch C46 --stream-id 19001)。
各コマンドの詳細は次の文書にあります。
| 知りたいこと | 文書 |
|---|---|
チューナーの一覧と選局。listとtuneの書き方、チューナー名、衛星チャンネルの指定 |
docs/reference/tune.md |
| 選局オプション。LNB給電、LNBf、利得、優先度、同期検査 | docs/reference/tune-options.md |
スキャン。--route、--discover、ISDB-S3の書き方、J.83のannex差、中断と再開 |
docs/scanner/scan.md |
| エクスポート。各形式への変換 | docs/scanner/export.md |
Mirakurun連携。tuners.ymlの書き方、decoderとPC/SC |
docs/setup/mirakurun.md |
| 知りたいこと | 文書 |
|---|---|
coaxの考え方。状態を持たないデーモンcoaxdをクライアントが分け合う形 |
docs/concepts.md |
| 初回セットアップの通し手順(ファームウェア、OSごとの準備を含む) | docs/setup/getting-started.md |
| Mirakurun、EPGStation、TVTest、EDCB、recpt1との関係。OSごとの層の図 | docs/stack.md |
デーモンcoaxd。対応チューナー、対応プラットフォーム、HTTP API、制限事項 |
docs/daemon.md |
| 対応デバイス一覧、ファームウェアの入手先、ボード別の詳細 | docs/README.md |
| DVB-S2の放送。トランスポンダ名、22kHzトーン、DiSEqC | docs/scanner/dvb-s2.md |
| チャンネル定義ファイルの書式(プロパティの正典) | docs/reference/channel-files.md |
衛星チャンネルの書き方(BS15_1か16625か)とドライバー別の対応 |
docs/reference/satellite-channels.md |
内蔵カードリーダー(coax card) |
docs/reference/card-reader.md |
| デーモンの動作仕様、チューナーIDの作り方、コマンドラインフラグ | docs/reference/tuner-host.md |
実装の構成(coax側のパッケージの分け方) |
docs/scanner/architecture.md |
このリポジトリのために書いたコードはApache-2.0 OR GPL-2.0-or-laterのデュアルライセンスです。
px4_drvやカーネルドライバーなどに由来するファイルはその条件のまま(GPL-2.0-or-laterまたはGPL-2.0-only)で、どのファイルがどれかは冒頭のSPDX行にあります。
coaxとfwextractは、Apache-2.0ライセンスのみで利用できます。
coaxdはGPL-2.0-onlyのファイルを含むので、そのビルドは全体としてGPL-2.0-onlyです。
Apache-2.0はGPL-2.0-onlyと混ぜられないため、デュアルのファイルはcoaxdのビルドではGPLの側で使われます。
由来の一覧と全文はNOTICE、COPYING、LICENSE-APACHEにあります。
製品名や社名は、対応機器を示すのみで利用しています。
ベンダー製のファームウェアは同梱していません。