KEIAN の KTV-FSPCIE が手に入ったので、Ubuntu26 で利用してみる
KTV-FSPCIE は こんなやつ
https://kakaku.com/item/K0000047526/
https://firtel.blogspot.com/2024/12/ktv-fspcie-mxl136.html
放送波の内容を確認する機器です
ARIB STD-B25(デジタル放送におけるアクセス制御方式)の勉強として放送波の中を見てみます
R19?処理済み..かな?
認識確認
USB接続して、認識されているか確認
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0511:0029 N'Able (DataBook) Technologies, Inc. ISDB-T Full Segment Device
Bus 001 Device 003: ID 8087:0026 Intel Corp. AX201 Bluetooth
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 - Device 002 - ID 0511:0029 で ISDB-T が認識されている
video グループ設定
# video グループ設定
sudo groupadd video
sudo gpasswd -a USERNAME video
USERNAME ユーザを video グループに追加
( ※ USERNAME は利用しているユーザ名変更してください )
開発環境準備
## Ubuntu
sudo apt install \
build-essential \
pkg-config \
libpcsclite-dev \
libboost-thread-dev \
libboost-filesystem-dev \
libboost-all-dev \
libboost-system-dev
## Fedora
sudo dnf install \
@development-tools \
pkgconf-pkg-config \
pcsc-lite-devel \
boost-devel
放送波複合ツール : recfsusb2n
# ツールダウンロード
git clone https://github.com/stz2012/recfsusb2n
# ダウンロードしたディレクトリに移動
cd recfsusb2n
Ubuntu26だといろいろ変わってるので修正が必要みたい
//# 変更前
#include <boost/filesystem/path.hpp>
//# 変更後
#include <boost/filesystem.hpp>
# 変更前
LIBS = -lpthread -lboost_thread -lboost_system -lboost_filesystem
# 変更後
LIBS = -lpthread -lboost_thread -lboost_filesystem
Fedora 44 では以下
//# 変更前
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
//# 変更後
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/directory.hpp> // ← これを追加!
#include <boost/filesystem/operations.hpp>
コンパイル
make
gcc -MM fsusb2n.cpp usbops.cpp em2874-core.cpp ktv.cpp IoThread.cpp B25Decoder.cpp tssplitter_lite.cpp > Makefile.dep
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o fsusb2n.o fsusb2n.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o usbops.o usbops.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o em2874-core.o em2874-core.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o ktv.o ktv.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o IoThread.o IoThread.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o B25Decoder.o B25Decoder.cpp
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -c -o tssplitter_lite.o tssplitter_lite.cpp
gcc -c -o arib25/arib_std_b25.o arib25/arib_std_b25.c
gcc -c -o arib25/b_cas_card.o arib25/b_cas_card.c
gcc -c -o arib25/multi2.o arib25/multi2.c
gcc -c -o arib25/ts_section_parser.o arib25/ts_section_parser.c
g++ -O2 -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -DTSSL -o recfsusb2n fsusb2n.o usbops.o em2874-core.o ktv.o IoThread.o B25Decoder.o tssplitter_lite.o ./arib25/arib_std_b25.o ./arib25/b_cas_card.o ./arib25/multi2.o ./arib25/ts_section_parser.o -lpthread -lboost_thread -lboost_filesystem `pkg-config libpcsclite --libs` -lm
sudo make install
rm -vf /usr/local/bin/recfsusb2n /etc/udev/rules.d/99-fsusb2n.rules
if [ -d /etc/udev/rules.d -a ! -f /etc/udev/rules.d/99-fsusb2n.rules ] ; then \
install -m 644 etc/99-fsusb2n.rules /etc/udev/rules.d ; \
fi
install -m 755 recfsusb2n /usr/local/bin
インストール確認
## 実行ファイル存在確認
ls -l /usr/local/bin/recfsusb2n
-rwxr-xr-x. 1 root root 2509392 9月 24 23:13 /usr/local/bin/recfsusb2n
## ルールファイル存在確認
ls -l /etc/udev/rules.d/99-fsusb2n.rules
-rw-r--r--. 1 root root 134 9月 24 23:13 /etc/udev/rules.d/99-fsusb2n.rules
## ルールファイル内容確認
cat /etc/udev/rules.d/99-fsusb2n.rules
# FSUSB2N
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"
udev ルール確認
cat /etc/udev/rules.d/99-fsusb2n.rules
# FSUSB2N
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"
usb 接続の 0511 の 0029 を 権限 0664 でvideo グループのユーザが利用できる
再起動
# 追加ルール反映
sudo udevadm control --reload-rules
# 再起動
sudo reboot
放送波の保存
# 32チャンネルを 30秒 /tmp/test32.ts に保存
recfsusb2n -b 32 30 /tmp/test32.ts
recfsusb2n ver. 0.9.2
ISDB-T DTV Tuner FSUSB2N
device: /dev/bus/usb/001/002
pid = 2205
B25Decoder initialized.
done.
Rec time: 31 sec.
# ファイル確認 61,520,932 byte(60M)
ls -l /tmp/test32.ts
-rw-rw-r-- 1 USERNAME USERNAME 61520932 May 9 14:52 /tmp/test32.ts
チャンネルは以下を参照
マスプロ さん
https://www.maspro.co.jp/wp-content/themes/maspro/file/reference/tv-channel-list.pdf
DXアンテナ さん
https://qa.dxantenna.co.jp/faq_detail.html?category=&page=1&id=2701
コマンド実行時の放送波を /tmp/test32.ts ファイルとして保存
保存TSの確認
こちらのツールを使わせていただく
https://gist.github.com/tsukumijima/48cc26595bc2b05debdba2a655068696
python 環境
sudo apt install python3-venv python3-full python3-pip
python3 -m venv ~/pyenv
source ~/pyenv/bin/activate
pip install ariblib
ツールダウンロード
curl -O https://gist.githubusercontent.com/tsukumijima/48cc26595bc2b05debdba2a655068696/raw/1c7868bb1c25065a00ce2675ad42af6a1a40f19f/TSInfoExtractor.py
ツール実行
python TSInfoExtractor.py /tmp/test32.ts
{
"record": {
"start_time": "2026-05-09T15:21:06.474900+09:00",
"start_margin": -1266.4749,
"end_time": "2026-05-09T15:21:35.500000+09:00",
"end_margin": -504.5,
"duration": 29.0251
},
"channel": {
"id": "NID32295-SID29752",
"network_id": 32295,
"service_id": 29752,
"transport_stream_id": 32295,
"remocon_id": 3,
"channel_name": "テレ玉1",
"channel_ts_name": "テレ玉",
"channel_type": "GR",
"channel_service_type": "デジタルTVサービス"
},
"program": {
"id": "NID32295-SID29752-EID10374",
"network_id": 32295,
"service_id": 29752,
"event_id": 10374,
"title": "テレビショッピング・ダイレクトテレショップ[S]",
"description": "シュワッ!とパンチ 0120-4141-81",
"detail": {
"番組内容": "シュワッ!とパンチ 0120-4141-81"
},
"start_time": "2026-05-09T15:00:00+09:00",
"end_time": "2026-05-09T15:30:00+09:00",
"duration": 1800.0,
"is_free": true,
"genre": [
{
"major": "情報・ワイドショー",
"middle": "ショッピング・通販"
}
],
"video": {
"type": "映像1080i(1125i)、アスペクト比16:9 パンベクトルなし",
"codec": "mpeg2",
"resolution": "1080i"
},
"primary_audio": {
"type": "2/0モード(ステレオ)",
"language": "日本語",
"sampling_rate": "48kHz"
},
"secondary_audio": {
"type": null,
"language": null,
"sampling_rate": null
}
}
}
ちゃんと放送波を保存できてるっぽい
EIT(番組表)取り出したり、多言語放送時はどのような指定になっているのか、などなど色々見てみようかな