TS 録画ファイルを B25 デコードする

「PLEX PX-Q3PE4 で docker-mirakurun-epgstation を使いたい」
https://qiita.com/nanbuwks/items/640ee4405e1fdd2ca497

にて TV 録画管理を mirakurun-epgstation に移行してから半年。

大体は調子がいいのですが、BCAS カードが時々認識しなくなります。以前 Windows10 + EDCB で動かしていたときも同様に BCAS カードが認識しなくなるときがあるけど、年に 1 回か 2 回だったのに比べると頻度が多い感じ。



結果、視聴できないファイルができてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e8c4bc40-abfa-0831-b34a-5c863879d077.png)
さて、どうしようかな?

今回は、カードが読めなくなる問題は別に解決するとして、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 カードとカードリーダー。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/29d782c8-6dd6-b001-6dd4-b9474fd7297e.png)

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などで再生できればいい。


https://twitter.com/TVRemotePlus/status/1385279787111907330

という話もあるが、Linux上の 3.0.16 Windows 上の3.0.17 両方とも再生できなかった。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d68cdcff-409e-0392-7456-575ddbe53bd7.png)

# Windows で TVTest


比較のために TVTest をインストール。

https://github.com/tsukumijima/DTV-Built より、TVTest-0.10.0-220711.zip をダウンロード。
この Zip ではTvTestVideoDecoder が同梱されている

解凍して filter-install.jse　をダブルクリックしてインストール。管理者権限の起動を特に指定していなくても管理者権限で設定される。

設定で B25 デコード設定を以下のように行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/efda4d13-13d2-11b8-e07b-3548d4cff3f9.png)

プラグインの TvtPlay を選択すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e3ea007b-284e-b5d3-9b49-79fea666a1e1.png)

ファイル選択ができるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/eeebe802-b9d4-5b22-069e-e31bb091dfc2.png)

視聴できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/58ca8dba-19a8-a75a-c011-528d3ede53bb.png)


# Ubuntu でデコードする


https://github.com/tsukumijima/libaribb25

こちらを導入します。

事前準備
```
$ 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で視聴できました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3d22a272-1c5f-cc17-bdae-9f849b1aaaba.png)


# これを使って

失敗したのをチェックしたいと考えていましたが、変換も早いしこれだと失敗判定せずに、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 などへ変換ができません。「エンコード」から以下のように指定すると


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/708271ff-1772-8f1a-4a21-707764cd42d3.png)

数分この画面のままで変化せずにエンコード処理が終了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/31a17efd-59ed-a449-cc68-2bcc57c1792c.png)

生成された 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
```

「元ファイルを削除する」を指定して処理させると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d5b525f3-75bd-ec78-9ba5-4cbade90602f.png)

元ファイルが失われ、サイズ 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 デコードミスをうっかり気づかずに元ファイル削除つきエンコード処理したりしてしまうと、録画ファイルが失われてしまいます。

対策は考え中です。