「PLEX PX-Q3PE4 で docker-mirakurun-epgstation を使いたい」
https://qiita.com/nanbuwks/items/640ee4405e1fdd2ca497
にて TV 録画管理を mirakurun-epgstation に移行してから半年。
大体は調子がいいのですが、BCAS カードが時々認識しなくなります。以前 Windows10 + EDCB で動かしていたときも同様に BCAS カードが認識しなくなるときがあるけど、年に 1 回か 2 回だったのに比べると頻度が多い感じ。
結果、視聴できないファイルができてしまいます。
さて、どうしようかな?
今回は、カードが読めなくなる問題は別に解決するとして、B25 スクランブルがかかったファイルのリカバリーを考えます。
仕組みと作戦
日本の TV 放送は B-CAS カードを使って、B25デコードをします。
STD-B25 規格
「標準規格概要(STD-B25)|一般社団法人 電波産業会」
https://www.arib.or.jp/kikaku/kikaku_hoso/desc/std-b25.html
こちらによると、
ECM
Entitlement Control Message
デスクランブルを行う際に用いる関連情報のうちの番組情報、鍵情報(スクランブル鍵)及びデスクランブル機能の制御(有効化/無効化)情報。共通情報と呼ばれる。
MULTI2
省令告示で定められたスクランブルの方式。
とあります。
B-CASカード
写真は B-CAS カードとカードリーダー。
B-CAS カードは BS CONDITIONAL ACCESS SYSTEMS ということらしいです。デスクランブルに使う鍵が B-CAS カードに入っていて、それを使ってカードリーダーで何かをしているのかな?
mirakurun-epgstation
mirakurun-epgstation においては、Mirakurun でチューナーにアクセスし、epgstation が予約管理、ファイル管理、録画取得などを行います。ここで B25デコードは Mirakurun 中で行っています。
リカバリーを別PCで行う
サーバはカードを管理する pcsc サービスが Mirakurun で専有しています。録画したものは epgstation にあるので、これを B25デコードするには Mirakurun に渡さなければなりません。ちょっとめんどくさそうなので、別 PC に B-CAS カードとカードリーダーをつなげて、該当ファイルのスクランブル解除をすることにします。
環境
- Ubuntu 22.04 LTS
- AMD Ryzen 5 5600G
比較環境
- Windows10
VLC で再生?
再生ができない問題、
デコードできてなくてもVLCなどで再生できればいい。
という話もあるが、Linux上の 3.0.16 Windows 上の3.0.17 両方とも再生できなかった。
Windows で TVTest
比較のために TVTest をインストール。
https://github.com/tsukumijima/DTV-Built より、TVTest-0.10.0-220711.zip をダウンロード。
この Zip ではTvTestVideoDecoder が同梱されている
解凍して filter-install.jse をダブルクリックしてインストール。管理者権限の起動を特に指定していなくても管理者権限で設定される。
設定で B25 デコード設定を以下のように行う。
プラグインの TvtPlay を選択すると
ファイル選択ができるようになる
視聴できました。
Ubuntu でデコードする
こちらを導入します。
事前準備
$ sudo apt install cmake libpcsclite1 libpcsclite-dev pkg-config
既に色々インストールしているデスクトップなので、もしかしたら他にも必要なものがあったかも知れません。
レポジトリをクローン
$ git clone https://github.com/tsukumijima/libaribb25.git
$ cd libaribb25/
ビルドします。
$ cmake -B build
$ cd build
$ make
あっさりメイクできました。
インストールします。
$ sudo make install
Consolidate compiler generated dependencies of target aribb1-objlib
[ 22%] Built target aribb1-objlib
[ 27%] Built target aribb1-static
[ 31%] Built target aribb1-shared
Consolidate compiler generated dependencies of target b1
[ 40%] Built target b1
Consolidate compiler generated dependencies of target arib-b1-stream-test
[ 50%] Built target arib-b1-stream-test
Consolidate compiler generated dependencies of target aribb25-objlib
[ 72%] Built target aribb25-objlib
[ 77%] Built target aribb25-static
[ 81%] Built target aribb25-shared
Consolidate compiler generated dependencies of target b25
[ 90%] Built target b25
Consolidate compiler generated dependencies of target arib-b25-stream-test
[100%] Built target arib-b25-stream-test
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/bin/b1
-- Set runtime path of "/usr/local/bin/b1" to ""
-- Installing: /usr/local/bin/arib-b1-stream-test
-- Set runtime path of "/usr/local/bin/arib-b1-stream-test" to ""
-- Installing: /usr/local/lib/libaribb1.a
-- Installing: /usr/local/lib/libaribb1.so.0.2.7
-- Installing: /usr/local/lib/libaribb1.so.0
-- Installing: /usr/local/lib/libaribb1.so
-- Installing: /usr/local/include/aribb1/arib_std_b25.h
-- Installing: /usr/local/include/aribb1/b_cas_card.h
-- Installing: /usr/local/include/aribb1/multi2.h
-- Installing: /usr/local/include/aribb1/ts_section_parser.h
-- Installing: /usr/local/include/aribb1/portable.h
-- Installing: /usr/local/lib/pkgconfig/libaribb1.pc
-- Running: ldconfig
-- Installing: /usr/local/bin/b25
-- Set runtime path of "/usr/local/bin/b25" to ""
-- Installing: /usr/local/bin/arib-b25-stream-test
-- Set runtime path of "/usr/local/bin/arib-b25-stream-test" to ""
-- Installing: /usr/local/lib/libaribb25.a
-- Installing: /usr/local/lib/libaribb25.so.0.2.7
-- Installing: /usr/local/lib/libaribb25.so.0
-- Installing: /usr/local/lib/libaribb25.so
-- Installing: /usr/local/include/aribb25/arib_std_b25.h
-- Installing: /usr/local/include/aribb25/b_cas_card.h
-- Installing: /usr/local/include/aribb25/multi2.h
-- Installing: /usr/local/include/aribb25/ts_section_parser.h
-- Installing: /usr/local/include/aribb25/portable.h
-- Installing: /usr/local/lib/pkgconfig/libaribb25.pc
-- Running: ldconfig
試してみる
$ arib-b25-stream-test < ../../../Desktop/2023年02月12日09時00分00秒-日曜討論 与野党に 問う 子ども・防衛費・多様性.m2ts > test.ts
error - failed on B_CAS_CARD::init() : code=-3
エラーが出ました。
「Linux下PT2的使用 - 数字生活」
https://sites.google.com/site/btvnlue/toolusage/pt2tvrec/linuxpt2dvb
によると、
解决: 重新b25编译,需要libpcsclite
b25执行时需要pcscd - IC卡daemon
ということで、 pcscd をインストールします。
$ sudo apt install pcscd
サービス起動します。インストール時にサービス起動していたかも?
$ sudo /etc/init.d/pcscd start
もしかしたら、 pcscd があれば VLC も動いたのかな? と思いましたが、この後試してみたけれどもやっぱり B25 スクランブルされたファイルは表示できませんでした。
なにはともあれこれで atrib-b25-stream-test は動くようになりました。
$ arib-b25-stream-test < 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m2ts > 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decodeb25.m2ts
processing: finish [ 6.59 MB/sec]
no EMM receiving request
5G程度が 100秒ぐらいでデコードできました。
変換結果、サイズは変わらないのですね。
$ ls -al 2023年02月12日09時00分00秒*
-rw-rw-r-- 1 nanbuwks nanbuwks 4978581220 2月 12 10:00 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m2ts
-rw-rw-r-- 1 nanbuwks nanbuwks 4978581220 2月 18 16:21 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decodeb25.m2ts
VLCで視聴できました。
これを使って
失敗したのをチェックしたいと考えていましたが、変換も早いしこれだと失敗判定せずに、mp4 などへのトランスコーディングといっしょに常に B25してもいいかも知れません。
一度デコードしたものをもう一度デコードもできるみたいです。
$ arib-b25-stream-test < 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decodeb25.m2ts > 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decode3.m2ts
processing: finish [ 7.76 MB/sec]
no EMM receiving request
$ md5sum 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性*
796ec353673a5332114bb73f46c7f792 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m2ts
78d1c422571dff219e7f5b9d6d2a2dcd 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decode3.m2ts
78d1c422571dff219e7f5b9d6d2a2dcd 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性decodeb25.m2ts
EPGStation 上の B25 デコードされていない録画データの扱い
EPGStation 上から録画ファイルが B25 デコードされているかどうかはメニューや APIからは取得できない感じ? せいぜいサムネイルが空白になっているぐらいかな。
しかしながら B25 スクランブルがかかっている状態だと、EPGStation から H.264 などへ変換ができません。「エンコード」から以下のように指定すると
数分この画面のままで変化せずにエンコード処理が終了しました。
生成された mp4 ファイルはサイズが 0 です。
$ ls -alh 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m*
-rw-r--r-- 1 root video 4.7G 2月 12 10:00 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m2ts
-rw-r--r-- 1 root video 0 2月 18 19:37 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.mp4
「元ファイルを削除する」を指定して処理させると
元ファイルが失われ、サイズ 0 の mp4 ファイルだけが残りました。
$ ls -alh 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.m*
-rw-r--r-- 1 root video 0 2月 18 19:37 2023年02月12日09時00分00秒-日曜討論 与野党に問う 子ども・防衛費・多様性.mp4
B25 デコードミスをうっかり気づかずに元ファイル削除つきエンコード処理したりしてしまうと、録画ファイルが失われてしまいます。
対策は考え中です。