GNURadioでワンセグ放送を受信する

Linux上でワンセグの常時録画の必要があって色々調べたところ、GNURadio上で動作するgr-isdbtという地デジのデコーダを見つけた。このgr-isdbtをUbuntuにインストールして動作させたので記事にまとめておく。

スポンサーリンク

Docker環境docker-gnuradioのインストール

gr-isdbtは少し古いGNURadio3.7がベースになっており、Ubuntu18.04デフォルトでインストールされるGNURadioのバージョン3.8だとうまくビルド出来ない。そこで、gr-isdbtの作者が用意したGNURadio3.7のDocker環境docker-gnuradioをまずは構築する。

Dockerのインストール

まずはDockerをホストPCにインストールする。Ubuntuの場合は以下で一発インストールOK。

sudo apt install docker.io

デフォルトではDockerは一般ユーザで実行出来ない。自分をdockerグループに追加する。

sudo gpasswd -a $(whoami) docker
sudo systemctl restart docker.service

一度ログアウトしないとグループ追加が反映されないので注意。(例えばdocker psを実行してエラーが出なければ反映されている)

docker-gnuradio環境のビルド

適当な作業ディレクトリで以下を実行してコンテナをビルドする。

git clone https://github.com/git-artes/docker-gnuradio.git
cd docker-gnuradio/gnuradio-releases-37/
docker build -t ubuntu:gnuradio-releases-3.7 .

ビルドが終わったら、出来上がったDockerイメージを確認。

$ docker images
REPOSITORY   TAG                     IMAGE ID       CREATED          SIZE
ubuntu       gnuradio-releases-3.7   7ab618dc1a04   12 minutes ago   1.61GB
ubuntu       18.04                   7d0d8fa37224   12 days ago      63.1MB

コンテナの起動パラメータ

ホスト側からのコンテナ起動コマンドはドキュメントに書かれていた例を参考に以下のようにした。

docker run --net=host -e TZ=Asia/Tokyo --env=DISPLAY --volume=/data/1segRec:/home/gnuradio/stream --privileged -v persistent-37:/home/gnuradio/persistent -it ubuntu:gnuradio-releases-3.7 bash

主なパラメータの意味は以下。

パラメータ説明
-e TZ=Asia/Tokyoタイムゾーンの設定
--volume=/data/1segRec:/home/gnuradio/streamホスト側/data/1segRec/のディレクトリがコンテナ内から/home/gnuradio/stream/に見える
--privileged特権コンテナにする(コンテナ内からUSBデバイスが普通に見える)

また、コンテナの中からX Windowの画面が開けるようにするため、ホスト側で以下のオマジナイ実行が必要(忘れるとgnuradio-companion起動時に「Windowを開く権限が無い」みたいなエラーが出る)。

xhost +localhost

Dockerコンテナにgr-isrbtをインストールする

GNURadio本体は上記作業で既にコンテナ内へインストール済み。その他、コンテナ内でドライバやワンセグ受信用の各種モジュールのインストールを行う。コンテナ内ユーザgnuradioのパスワードは”gnuradio”で設定されているので、sudo実行の時は適宜入力する。

デバイスのGNURadio用ブロックをインストール

RF受信を行うSDRデバイス用のGNURadio用ブロックをインストールする。当ブログではUSBワンセグチューナーHackRF OnePlutoSDRのGNURadioセットアップを取り上げたが、コンテナ内で使えるようにするためにコンテナへのインストール作業が必要。

コンテナ内でのインストール作業はホストで行う方法と全く同じなので、詳細は過去記事を参照。例えばUSBワンセグチューナーのインストール作業は以下のような感じ。(aptでバイナリインストールだと何故かうまく行かないかったので、ソースからビルドしている。コンテナ内のGNURadioのバージョンが3.7なので、それに合わせている所がポイントだ。)

sudo apt install librtlsdr-dev
git clone git://git.osmocom.org/gr-osmosdr
cd gr-osmosdr/
git checkout gr3.7
mkdir build
cd build/
cmake ../
make
sudo make install
sudo ldconfig

デバイスの入出力ブロックをインストールした段階でコンテナの中のGNURadioから、以前の記事で作ったFMラジオなどが動けばOK。

時々コンテナ内からSDRデバイスが見えなくなってしまう場合があるが、その場合は一旦コンテナを終了させた後、USBの抜き差しをしてから再度コンテナを起動すると復活する事が多い。

gr-isdbtのインストール

さて、いよいよワンセグ受信モジュールであるgr-isbtのインストール作業をコンテナの中で行う。

GitHub - git-artes/gr-isdbt: DTV ISDB-T in GNURadio
DTVISDB-TinGNURadio.Contributetogit-artes/gr-isdbtdevelopmentbycreatinganaccountonGitHub.

ビルドのための一連のコマンドは以下の通り。

git clone https://github.com/git-artes/gr-isdbt.git
cd gr-isdbt  
mkdir build  
cd build  
cmake ../
make

あとはインストールで完了。

sudo make install
sudo ldconfig

Dockerイメージの更新

上記コンテナ内でのインストール作業を終えたら、シェルからexitを実行して一旦コンテナを抜け、ホスト側でDockerイメージの更新を行っておいた方が良い。(やらないと、コンテナの中で同じインストール作業を繰り返し実行する羽目になる)

docker ps -aでコンテナIDとイメージの対応を確認する。

$ docker ps -a
CONTAINER ID   IMAGE                          COMMAND   CREATED              STATUS                      PORTS     NAMES
f1de23be6da3   ubuntu:gnuradio-releases-3.7   "bash"    About a minute ago   Exited (0) 12 seconds ago             serene_hawking

以下を実行。

docker commit f1de23be6da3 ubuntu:gnuradio-releases-3.7

gr-isrbtによるワンセグ受信

GitHubから持ってきた一式の中のexamplesディレクトリに1セグ受信のサンプルフローグラフが含まれている。
(gr-isdbt/examples/rx_1seg_demo.grc)

デフォルトの状態だとRTL-SDRをソースブロックにしたフローグラフなので、使いたいSDRデバイスに応じて適宜ブロックを変更して使う。自分の環境では、USBワンセグチューナ(RTL-SDR)とHackRF Oneではうまく受信出来ず、PlutoSDRだけが成功した。

フローグラフ

ワンセグ受信に成功すると、上のキャプチャ画面のようになる。

  • 別ウインドウのダイアログ(右下)に表示されるコンスタレーション図でQPSKの散布図が綺麗に4点へ集まる
  • 左下のメッセージウインドウに”TMCC OK”の文字列が繰り返し表示される

録画したワンセグ動画の変換

以下のコマンドでMP4ファイルに変換すると普通の動画ビューワーで視聴出来るようになる。

ffmpeg -i test.ts -c copy test.mp4

まとめ

予想以上に手間がかかったが、とりあえずGNURadioでワンセグの受信が出来るようになった。
格安USBワンセグチューナーで受信が出来なかったのは残念だが、宝の持ち腐れ状態だったPlutoSDRが活用出来そうなので良しとしよう。

コメント