地上デジタル放送に乗っている時刻パケットを拾って現在時刻を表示する時計を作った

こんにちは。割と本気で精神を病んでます。

TS抜きチューナーやワンセグチューナーからパイプで標準入力に入ってきた地上デジタル放送のストリームを読み込んで、その中にあるTDT(時刻情報パケット)を取り出して現在時刻を表示する時計をPython3で作りました。

./recfsusb2n –trim 10000 27 – – | ./isdbclock.py

たとえばrecfsusb2nならこのように動かすと…

スクリーンショット_2016-08-15_23-38-20.png

GUIで地デジベースの時刻を教えてくれます。これで電波時計の電波は届かなくて、インターネットにもつながってないけど、なぜか地デジの電波だけ入る場所でも時刻がわかるね!!

残念ながら、たぶん変調復調、CATVでのメディアコンバートのせいで遅延があって、0.7秒くらい標準時から遅れます。なのでネタ用途にしか使えないです。

時計GUI部分はむかしつくったNTP時計を流用してるので、微妙なコードです。そのへんはご愛嬌ですね。

地デジ部分は、sys.stdin.buffer.read(packet_length)とやって標準入力から読み込んで、いったんio.BytesIOにwrite()してバッファしてから読み込んでいます。ファイルから読み込むのよりもやっぱり難しいですね。でもこれでやり方がつかめたので、いろいろ活用が広げられそうです。

パースはbitstringを使用していますが、Pure Pythonなのでめっっっちゃ遅いです。i5でも5秒分の処理に7秒位かかります。仕方ないので今回は2つにひとつのパケットのみ処理することにしました。syncとPIDのパースを自分で実装したら、結構早くなるかもです。

bitstringのfindは文字列で検索バイトを渡すというのと、BytesIOやStringIOは終端ではなくてseek位置から書き込んで、seek位置から読み込むというのと、バイナリがほしいならPython3ではsys.stdin.bufferを使うのあたりでハマりました。

以上です。今度もまたなんか面白いことやりたいです。

広告
カテゴリー: コンピュータ, Python パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中