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 OneとPlutoSDRの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のインストール作業をコンテナの中で行う。
ビルドのための一連のコマンドは以下の通り。
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が活用出来そうなので良しとしよう。
コメント