DVB-T
DVB-T は地上デジタルビデオ放送に使われている国際規格です。DVB-T は様々なハードウェアを使って受信することができますが、この記事では RTL2832U チップセットを搭載した DVB-T USB ドングルだけを扱います (RTL-SDR による安価なソフトウェア無線としても広く使われています)。
目次
ドライバー
使用するメインのドライバーは dvb_usb_rtl28xxu
です。最新カーネルに含まれています。ドライバーがロードされていない場合、手動でロードしてください:
# modprobe dvb_usb_rtl28xxu
rtl2832
や rtl2830
もロードする必要があるかもしれません:
# modprobe rtl2830 # modprobe rtl2832
デバイスを接続すると、dmesg
で以下のように確認できるはずです:
[ 4009.326338] usb 7-5: new high-speed USB device number 4 using ehci-pci [ 4009.466712] usb 7-5: dvb_usb_v2: found a 'Realtek RTL2832U reference design' in warm state [ 4009.531594] usb 7-5: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer [ 4009.531613] DVB: registering new adapter (Realtek RTL2832U reference design) [ 4009.534554] usb 7-5: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))... [ 4009.534627] r820t 4-001a: creating new instance [ 4009.546177] r820t 4-001a: Rafael Micro r820t successfully identified [ 4009.552681] Registered IR keymap rc-empty [ 4009.552783] input: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:1d.7/usb7/7-5/rc/rc1/input20 [ 4009.552854] rc1: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:1d.7/usb7/7-5/rc/rc1 [ 4009.553275] input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input21 [ 4009.554466] rc rc1: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0 [ 4009.554474] usb 7-5: dvb_usb_v2: schedule remote query interval to 400 msecs [ 4009.565930] usb 7-5: dvb_usb_v2: 'Realtek RTL2832U reference design' successfully initialized and connected
さらに、/dev/dvb/adapter0
下でアダプタデバイスが確認できれば問題ありません。カードによっては、様々な理由によって配布されていない追加のファームウェアが必要になります。大抵の場合 dmesg でメッセージが確認できます。お好きな検索エンジンでファイル名を検索して、発見したら、/usr/lib/firmware
にファームウェアを保存してください。また、AUR にパッケージが存在することもあります。
ユーティリティ
linuxtv-dvb-apps パッケージに様々な DVB ユーティリティが入っています。
スキャン
w_scanAUR を使うことでチャンネルの自動スキャンが行えます (設定不要)。プログラムをインストールしたら次を実行してください:
# w_scan -ft -c [country_code] > ~/channels.conf
国名コードがわからない場合、以下を実行することでコードのリストを確認できます (場合によっては国名コードは任意です。詳しくは man w_scan
を参照):
# w_scan -c "?"
高度なスキャンオプションは DVB-S#チャンネルのスキャンに記載されています。w_scan の man ページ や ドキュメント も参照してください。
クライアント
プレイヤーを起動する前あるいは後に、設定ファイルや xset
コマンドを使ってビデオや TV の再生中にスクリーンセーバーを無効化する方法を見てください。xscreensaver をインストールしている場合、xset
ではなく xscreensaver-command
を使ってコマンドラインからスクリーンセーバーを有効化・無効化する必要があります。
VLC
VLC で DVB-T のチャンネルを視聴する場合、プレイリストを生成するのが一番簡単です:
$ w_scan -ft -c [country_code] -L > dvb.xspf $ vlc dvb.xspf
もしくは、手動で周波数を指定することもできます。以下のコマンドを使用して DVB-T ストリームを表示できます:
$ vlc dvb://frequency=543000000
周波数は Hz 単位でセットします。あなたの地域で送波に使われている基準周波数を指定する必要があります。また、復調方式は自由に指定することができます。dvb
の代わりに dvb-t
や dvb-t2
などが利用可能です。
VLC では様々なコマンドライン引数を使うことができ、例えば、他のプログラムに同調したい場合:
$ vlc dvb://frequency=543000000 :program=3
MPlayer / mpv
DVB をストリーミングするとき、MPlayer (や mpv) は ~/.mplayer/channels.conf
にチャンネルの設定ファイルを必要とします。#スキャンの指示に従ってファイルを生成してください。ただし、コマンドで -M
フラグを使って MPlayer から利用できるフォーマットで生成するようにしてください。w_scan
を使用する場合:
$ w_scan -ft -c [country_code] -M > ~/.mplayer/channels.conf
mpv を使用する場合:
$ w_scan -ft -c [country_code] -M > ~/.config/mpv/channels.conf
mplayer dvb://
を実行して設定をテストしてください。最初のチャンネルが再生されるはずです。再生されない場合、ストリームを受信するために -demuxer lavf
や -demuxer mpegts
を使う必要があります。
設定が上手くいったら次を実行:
$ mplayer dvb://"STREAM NAME"
STREAM NAME
はチャンネルの設定ファイルに記載されている適当なチャンネル名に置き換えてください。
チャンネルセレクタ
以下の lstvAUR スクリプトは ~/.mplayer/channels.conf
ファイルからデータを読み込んで、チャンネルの番号付きリストを表示します。スクリプトによって表示された番号をコマンドラインで使うだけで、チャンネルの名前を入力しなくてもチャンネルを視聴することができるようになります。例: lstv 3
。スクリプトによって表示されるチャンネル番号はチューニング設定の行番号と対応しています。また、mplayer を起動する前にスクリプトはディスプレイの省電力機能とスクリーンセーバーを無効化して、スクリプトを終了した後に、もういちど有効化します。スクリプトのスクリーンセーバー管理を無効化したいときは MPlayer の前後にある xset ...;
を削除してください。
/usr/local/bin/lstv
#!/bin/bash if [ "$1" ];then CC='^[0-9]+$'; if ! [[ "$@" =~ $CC ]];then echo Is not a channel number!; else ## awk -F':' -v AA="$1" '//{ZZ++; if(AA == ZZ)system("xset -dpms s off;mplayer dvb://""\""$1"\";xset +dpms s on")} END{if(AA > ZZ)printf "The highest channel number is: "ZZ"\n"}' "$HOME/.mplayer/channels.conf" ## fi; else awk -F':' '// { ZZ++; printf ZZ " | " $1 "\n"}' "$HOME/.mplayer/channels.conf" fi;
ffmpeg
FFmpeg では DVB-T の MPEG ストリームを入力に指定できますが、tzap
が必要になります。
まず、w_scan
を使って tzap 互換の channels.conf
ファイルを生成してください:
$ w_scan -ft -A1 -X > ~/.tzap/channels.conf
そして、次を実行:
$ tzap -r "CHANNEL NAME"
正しく設定されていれば、以下のように出力されます:
$ tzap -r "CHANNEL NAME" using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' reading channels from file '/home/user/.tzap/channels.conf' Version: 5.10 FE_CAN { DVB-T } tuning to 506000000 Hz video pid 0x0a21, audio pid 0x0a22 status 00 | signal 0000 | snr 0000 | ber 0000ffff | unc 00007fbd | status 1f | signal 0000 | snr 0126 | ber 00000000 | unc 00007fbd | FE_HAS_LOCK status 1f | signal 0000 | snr 0129 | ber 0000000f | unc 00007fbd | FE_HAS_LOCK status 1f | signal 0000 | snr 0120 | ber 00000003 | unc 00007fbd | FE_HAS_LOCK status 1f | signal 0000 | snr 0125 | ber 00000011 | unc 00007fbd | FE_HAS_LOCK # ....
tzap
に関する詳細は zap の wiki ページ を見てください。
tzap
でストリームを符号化することで、ffmpeg
(やその他のプログラム) から /dev/dvb/adapter0/dvr0
が使えるようになります。
余計なエンコードを行わないで番組をストリームするシンプルなコマンドは以下のようになります:
$ ffmpeg -f mpegts -i /dev/dvb/adapter0/dvr0 out.mp4
トラブルシューティング
何か問題が発生した場合、以下のツールを使ってデバッグできます:
- dvbsnoopAUR はバンド幅・シグナル・フロントエンドなどに関するあらゆるデータを表示することができる上級者向けのツールです。
femon -H
は信号の状態を表示します。