前書き
地上波で配信されているストリームがどのような構造・仕組みで流れているか、というのが気になったので、軽く検証してみました。
地上波を流れるストリーム
地上波の番組の映像や番組情報・メタデータはMPEG2-TS(通称TS)で配信されています。
パケットにどういう形式でデータを含めるか、だったりアクセス制御だったりの取り決めが多々ありますが、ARIB(一般社団法人 電波産業会)という団体が、これら全体の仕組みの標準化をおこなっています。
無料だと英語版しか閲覧できませんが、こちらで放送にまつわる標準規格が閲覧できるので、興味がある方は読んでみてください。
方法
まずRaspberry Pi(4 Model)にカードリーダ経由でB-CASカードを認識させました。そしてチューナとしてPLEXのドングル型USBチューナをラズパイに接続し、家の壁から生えているF型ケーブルと合体させます。
※実験ついでに録画サーバを立てたかったのでラズパイで組みましたが、Windowsデスクトップでも良いと思います
ちなみにカードリーダは こちら を使っていて、B-CASカードは元々家にあったものを使用しました。
次にソフトウェア側ですが、Mirakurun をラズパイにインストールして、地上波のtsパケットをデコードしつつホームネットワーク内に配信して視聴できる状態にしました。
※Mirakurunでデコードするので、生tsではなくなりますが
試した番組
ちょうどTOKYO MXでドラゴンボールZが放送されていたので、この番組で実験しました。
画像はホームネットワーク内に流した番組ストリームをVLCプレーヤで取り込み、番組名を認識したときのスクショです。
ご存知の方が多いと思いますが、地上波は基本的には全番組で暗号化(スクランブル)がかかっている状態で配信されています。これを受信・再生する際にB-CASカードのID情報や契約者情報などを利用してデスクランブル(復号)します。ただ例外があり、NHKなどは緊急放送時にスクランブルを解除した状態で放送する場合があります(つまりB-CASカードなしでも再生できる)。
この辺のアクセス制御の仕様は、ARIBが標準化を担っていて、限定受信システム(Conditional Access System : CAS)という名称で仕様が定義されています(B-CAS方式とも呼ばれる)。
※参照1:デジタル放送におけるアクセス制御方式
※参照2:デジタル放送におけるアクセス制御方式(第2世代)及びCASプログラムのダウンロード方式
いざチラ見
まずは愚直に、ffprobeでラズパイから配信しているストリームのurlを指定します。
# `16` はTOKYO MXのチャンネルID
# `23608` はそのチャンネルの中の子チャンネル(serviceと呼ぶのが正しい?)
# ※TVでよく1チャンネルを再生中に「次へ」を押すと
# 2チャンネルではなく101や102チャンネルに移動しますが、あれのこと
$ ffprobe http://192.168.40.71:40772/api/channels/GR/16/services/23608/stream
すると下記の結果が出力されました。
まずはわかりやすい部分から
ビットレートは9654Kbpsなので、FullHD〜2Kの間くらいの映像が配信できそうなレートですね。地上波の多くは実際2K放送らしいですが、2Kにしては少々低いレートに感じました。仮説ですが、今回見ている番組はかなり昔の番組の再放送なので、そもそもややガビガビの映像のため、低めのビットレートとなっているのだと思います。
また、メタデータの service_name
という項目にチャンネル名が入っています。
多重化されているパケットに注目する
次にその下の Stream #0:28[0x111]
と表示されている部分を見ていきましょう。
tsファイル(MPEG2-TS)は映像や音声など、複数の種類のデータを細かくパケット化して送信することを想定したつくりとなっています(ISO-13818-1)。で、パケットの種類ごとにPID(Packet ID)が振られているようで、画像で言うと [oxXXX]
の部分がPIDとなります。
パケットは全部で13種類あるようです。多いですね。111〜115が、それぞれ映像・音声・字幕・データ、が入っているように見てとれます。それ以外は Unknown
として表示されていますね。
MPEG2-TSでは、映像や音声など、常時流れ続けるデータのことをPES(Packetized Elementary Stream)と呼びます。またそれら以外の、番組情報やその他のメタデータのことをPSI(Program Specific Information)と呼びます。そして今回は解説しませんが、PESとPSIによってtsデータの解釈の方法が変わるようです。
ffprobe上ではおそらく PES 系データのみ名前が表示されていて、PSI系のデータは Unknown
と表示されいるように見えます。
後書き
マジで触りの部分だけですが、地上波放送ストリームの中身を覗いてみました。身近な存在なのになかなか目にする機会がない存在なので、面白いです。
後編では映像や音声をさらに細かく覗いたり、ARIBの標準規格と照らし合わせて、さらに深ぼってみていきます。
お楽しみに〜
余談
地上波は、例えば緊急速報の時によく出てくるL字放送・L字電報(例)や、リレー放送 といった仕組みもあります。こういった動作をするためのデータもtsパケットに含まれてきそうと推測していますが、興味があるので気が向いたら番外編として書いてみます。