Linuxでワンセグ録画 その3 (dvbsteram, mplayerのビルド&視聴)

続きです。

前回まででドライバのビルドが完了し、ドライバのロード、LOG-J200の認識までいきました。ワンセグのTSストリームを取り出すにはドライバだけじゃだめで、dvbstream コマンドが必要です。

dvbstream はここからダウンロードできます。そのままビルドしてもいいのですが、ぱぱネット(仮)さんで公開されているLOG-J200のドライバ(前回ダウンロードしたもの)のアーカイブ内に、8ch分同時起動可能にするパッチが入っているので、これも当ててビルドします。

まずは、dvbstream-0.5.tar.gzをダウンロードし、展開します。

$ cd ~/project/oneseg/file
$ wget http://jaist.dl.sourceforge.net/project/dvbtools/dvbstream/dvbstream-0.5/dvbstream-0.5.tar.gz
$ cd ..
$ tar xf file/dvbstream-0.5.tar.gz

前回展開したlog-j200用ドライバ内のパッチを当ててビルドします。

$ cd dvbstream-0.5
$ patch -p0 < ../logj200/dvbstream.patch
$ make
$ mkdir ~/project/oneseg/bin
$ cp dvbstream ../bin

これで dvbstream がビルドできます。最後にビルドしたバイナリを ~/project/oneseg/bin にコピーしています。

次にワンセグTSを再生可能な mplayer をビルドします。mplayerのビルドはまたまたぱぱネット(仮)さんのこの記事を参考にしました。

mplayerのソースと適用するパッチ類をダウンロードします。最新のmplayerではうまくパッチが当たらなかったので、少し古いMPlayer-1.0rc4.tar.bz2を使います。パッチはここからダウンロードします。

$ cd ~/project/oneseg/file
$ wget http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc4.tar.bz2
$ wget http://jaist.dl.sourceforge.net/project/dus01withlibusb/dus-01withlibus/dus01withlibusb-0.009/dus01withlibusb-0.009.tgz
$ wget http://jaist.dl.sourceforge.net/project/dus01withlibusb/dus-01withlibus/dus01withlibusb-0.009/mplayer.ad_faad.c.patch

展開してパッチを当ててビルドします。

$ cd ~/project/oneseg
$ tar xf file/MPlayer-1.0rc4.tar.bz2
$ tar xf file/dus01withlibusb-0.009.tgz
$ cd MPlayer-1.0rc4
$ patch -p1 < ../dus01/mplayer1.0rc2_oneseg_.patch
$ patch -p1 < ../file/mplayer.ad_faad.c.patch
$ ./configure
$ make
$ cp mplayer ../bin

これもまた ~/project/oneseg/bin にコピーしています。

早速 TS ストリームを mplayer で再生してみます。

$ cd ~/project/oneseg/bin
$ ./dvbstream -c 0 -f 周波数 8192 -o | ./mplayer -

周波数は (チャンネル番号×6000+395143) で計算できます。チャンネル番号はこのページが参考になります。

例えば関東圏のフジテレビは 21 みたいなので、以下のようになります。

$ ./dvbstream -c 0 -f `expr 21 \* 6000 + 395143` 8192 -o | ./mplayer -
dvbstream v0.5 - (C) Dave Chapman 2001-2004
Released under the GPL.
Latest version available from http://www.linuxstb.org/
Using DVB card "MTV211"
tuning DVB-T (in United Kingdom) to 503143000 Hz
polling....
Getting frontend event
FE_STATUS:
polling....
Getting frontend event
FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC
Event:  Frequency: 513743000
        SymbolRate: 0
        FEC_inner:  2

Bit error rate: 0
Signal strength: 0
SNR: 0
FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC
Setting filter for PID 8192
Output to stdout
Streaming 1 stream

バッファリングにしばらく時間がかかります。実行して15秒くらいすると再生されると思います。

mplayerでワンセグ再生
mplayerでワンセグ再生

音声と画像がずれていて、このままでは視聴に耐えませんが、とりあえずワンセグTSを受信できることは確認できました。

本当はここでなかなか再生できず、 色々いじってみたんですが、最終的にはアンテナの位置が悪かったようで、アンテナを窓際に持っていったら再生できるようになりました。

受信できているのかどうかがよくわからなかったので、TSストリームを軽くパースして受信できているかをチェックするスクリプトを作ってしまいました。

うまく再生できない場合は、tscheck.pl.txt をダウンロードして、tscheck.plにリネームし、以下のように実行してみてください。

$ ./dvbstream -c 0 -f `expr 21 \* 6000 + 395143` 8192 -o | perl tscheck.pl
----省略----
TErr:0 PID:1fc8 5
TErr:0 PID:1fc8 6
TErr:0 PID:1fc8 7
TErr:0 PID:1fc8 8
TErr:0 PID:1fc8 9
TErr:0 PID:1fc8 a
TErr:0 PID:1fc8 b
TErr:0 PID:1fc8 c
TErr:0 PID:1fc8 d
TErr:0 PID:1fc8 e
TErr:0 PID:1fc8 f
TErr:0 PID:1fc8 0
TErr:0 PID:1fc8 1
TErr:0 PID:1fc8 2

上記のような行が、1秒に1〜2個の間隔で表示され、TErr が 0 で、最後の16進数値が 0〜f の間でループしていれば正しく受信できています。

TErrが 1 だったり、最後の数値が連続せず飛び飛びの場合は、アンテナの位置などを調整してください。

64bit kernel でもなんの問題もなくここまでこれました。先人達の偉業に感謝。

ただチューナの入手性の悪さのせいか、古い情報しかなく、情報やソースを集めるのに苦労しました。自分のメモも兼ねてこの記事を書いてます。

次回はTSストリームからmp4ファイルに変換してみようと思います。

Linuxでワンセグ録画 その2 (LOG-J200用ドライバのビルド)

前回の続きです。

さて、高値で買ったLOG-J200ですが、Linux のドライバがぱぱネット(仮)さんによって開発されています。これを Ubuntu 11.04 (linux-2.6.38 64bit)の環境で動かそうと思います。

64bitというのがクセモノっぽそうな気がしますが・・・まぁ、やるだけやってみましょう。

ぱぱネット(仮)さんのこのページから kernel-2.6.26 用 LOG-J200ドライバ(パッチ)をダウンロードできます。(logj200_linux_20090126.tar.gz)

ただ、このドライバはUOT-100用のドライバに対するパッチなので、pu2008さん作のUOT-100のドライバ(uot100-0.1.tar.gz)も必要です。README には最低限の事しか書いていないので、Wiki上の説明とlogj200_linux_20090126.tar.gz内の readme.txt を参考にパッチを当てていきます。

まずは ubuntu で使われている kernel をダウンロードします。

$ sudo apt-get install linux-source-2.6.38

あ、gcc など、kernelのビルドに必要なパッケージはあらかじめ入れておいてください。

適当な作業ディレクトリを作り、その下に kernel を展開します。私は ~/project/oneseg で作業することにしました。

$ mkdir -p ~/project/oneseg
$ cd ~/project/oneseg
$ tar xf  /usr/src/linux-source-2.6.38.tar.bz2

UOT-100のドライバとLOG-J200のドライバを ~/project/oneseg/file にダウンロードして展開します。

$ cd ~/project/oneseg
$ mkdir file
$ cd file
$ wget http://linux.papa.to/image/logj200_linux_20090126.tar.gz
$ wget http://jaist.dl.sourceforge.jp/uot100/29431/uot100-0.1.tar.gz
$ cd ..
$ tar xf file/logj200_linux_20090126.tar.gz
$ tar xf file/uot100-0.1.tar.gz

UOT100のドライバにLOG-J200用のパッチを当てます。

$ cd uot100-0.1/dvb-usb
$ patch -p0 <../../logj200/uot100-logj200.0.3.patch

パッチを当てたLOG-J200のドライバを linux kernel へコピーし、Makefileに追加します。

$ cd ~/project/oneseg/linux-source-2.6.28/drivers/media/dvb/
$ cp ~/project/oneseg/uot100-0.1/dvb-usb/* dvb-usb/
$ cp ~/project/oneseg/uot100-0.1/frontends/* frontends/
$ echo dvb-usb-uot100-objs = uot100.o >> dvb-usb/Makefile
$ echo obj-m += dvb-usb-uot100.o >> dvb-usb/Makefile
$ echo obj-m += mtv211.o >> frontends/Makefile

パッチ形式になってないので少し面倒ですね。たぶんカーネルバージョンによらず適用できるようにしたためだと思います。

さて、カーネルツリーにドライバを組み込めたのでUbuntu の config を読み込ませてビルドします。

$ cd ~/project/oneseg/linux-source-2.6.28/
$ cp /boot/config-2.6.38-8-generic .config
$ make ARCH=x86_64 oldconfig
$ make ARCH=x86_64 bzImage -j5
$ make ARCH=x86_64 M=`pwd`/drivers/media/dvb modules

make bzImage は時間がかかります。 -j オプションはCPUの数に応じてお好みで変更してください。

LOG-J200のドライバは kernel-2.6.26用だったんですが、kernel-2.6.38 でも特にエラーも出ずにビルドできました。

logj200のドライバの readme.txt では deb パッケージ作ってインストールしていますが、実験レベルなので、debパッケージまでにはせず、個別に insmod することにします。

以下のコマンドでドライバをロードします。

$ sudo modprobe dvb-usb
$ sudo insmod ./drivers/media/dvb/dvb-usb/dvb-usb-uot100.ko
$ sudo insmod ./drivers/media/dvb/frontends/mtv211.ko

これでドライバのロードが完了。LOG-J200をUSBポートに挿して、認識されているかログを確認します。

$ dmesg | tail
.....省略.....
[29046.439076] usb 2-1.1: new full speed USB device using ehci_hcd and address 9
[29046.552054] dvb-usb: found a 'LOGFARM LOG-J200' in warm state.
[29046.552130] dvb-usb: will use the device's hardware PID filter (table count: 16).
[29046.552456] DVB: registering new adapter (LOGFARM LOG-J200)
[29050.956459] DVB: registering adapter 0 frontend 70998304 (MTV211)...
[29050.957307] dvb-usb: LOGFARM LOG-J200 successfully initialized and connected.

こんな感じでログが出ていればOKです。

今日はここまで。次回は dvbstream を使ってワンセグTSを抜き出します。

Linuxでワンセグ録画 その1

約半年ぶりの投稿になります。まだ見てくれている人はいるのでしょうか?

またまた中途半端な状態で放置してしまってすいませんでした。

半年の間に色々ありました。なんと言っても東日本大震災です。幸い私も家族も実家も、身近な人はみな無事でしたが、都内勤務だったため当日は帰宅困難になったり、しばらく物が買えなくなったり色々大変でした。

勢いで作った radiko player も東日本大震災をきっかけに、エリア制限解除と称して(?)認証が入るようになってしまって、使えなくなってしまいました。

radiko 録音対応もそれまでほそぼそとやっていたのですが、もろくも打ち砕かれてしまいました。

某掲示板では radiko player のソースを独自に改造して今でも使える player を開発している人もいるようですが、認証を行うには法律的に危険な事をしないといけないため、私には手が出せません。

簡単に言うと、著作権で保護された画像を認証のキーにしており、その画像には、「この画像を無断で使用すると著作権侵害として法的措置を取る」といった趣旨の内容が書かれています。個人的には、著作物の個人利用は著作権侵害には当たらないような気もするのですが、法律に明るくないので手出しはできません。

ということで、radiko player は今後再リリースすることはないと思います。radiko にも規制が入ってしまって残念です。

 

さて、戯言はこれくらいにして、今回のお題はワンセグです。今回は zaurus とは全く関係ない話題です。

ちょっと昔に「24時間ワンセグ野郎」というのが注目されたのをご存知でしょうか?

「携帯動画変換君」で有名なMobileHackerzさんが作った、24時間全chのワンセグを録画して、見逃したテレビも振り返って見ることができるという、テレビっ子(表現が古いな・・・)には夢のようなシステムです。

最近 REGZA の CM で「30時間6つのチャンネルを遡って再生」と謳ってる「タイムマシンシフト」のような機能を、ワンセグながらすでに2008年には個人で実現していたんですからすごいですよね。

24時間ワンセグ野郎は Windows でのシステムだったんですが、その後 Linux や BSD 用のドライバを書く人も現れて、今では Linux でもワンセグ野郎の環境が構築できるようです。

で、いまさらながら私も Linux でのワンセグ録画を試してみました。

ただ、Linuxでワンセグ録画ができるチューナーはかなり限られていて、ワンセグ野郎に対応しているチューナーは今ではほとんど入手困難です。たまにオークションで売りだされていますが、すごく高価なので8ch分揃えるにはお金と時間がかかりすぎます。

24時間録画しなくても、とりあえず予約録画出来て通勤時間に見れればそれでいいかなと思って1個だけ買ってみました。

LOG-J200 買いました
LOG-J200 買いました

買ったのはPCTV-hiwasa miniです。LOG-J200という型番のほうが有名かもしれません。

確かオークションで5,000円くらいしました。最近のワンセグチューナーは安いやつで1,000円台という事を考えると相当高いです。それだけ希少価値があるということでしょう。

こいつを使って Ubnutu 11.04 の環境でワンセグ録画にチャレンジしようと思います。

長くなったので今日はここまで。

radiko player に関するメモ

radiko player を公開してもう1週間。早いものです。 

個人的には zaurus で radiko を聴くという需要は少ないと思っていたので、遊び半分で作ったということもあり、思っていたよりも反響があってビックリしました。

ブログなど他の方々意見も参考に、今後開発するなら欲しい機能を挙げてみました。

  • エラーメッセージ表示
  • 録音&再生 
    • タイマー録音もできるといいな
  • 番組表表示

たぶん、一番需要がありそうな機能は録音&再生だと思います。

実は録音はすごく簡単です。ただ、再生が大変なんです。ファイルリスト、mplayer のコントロール(再生・停止・シークなどの操作) など、一気に処理が増えてしまうので、開発するには気合が必要です。

大変さを無視して個人的にできたらいいなーと思うのが、タイマー録音です。zaurus は電源を切っている状態でも指定時間に起動する機能を持っていますので、それと連動させれば、省エネな radiko 録音サーバにできそうです。番組表表示と組み合わせれば、キーワード検索でおまかせ録音とかもできちゃうかもしれません。回線の帯域さえ間に合えば複数番組録音もできると思います。

と、ちょっと妄想が膨らみましたが、たとえ zaurus で radiko を聞かない人でも省エネ radiko 録音機は欲しい人がいるのではないかと思います。

まぁ、そんな感じでできたらいいなーと思いを綴ってみました。時間とやる気があればそこまでたどり着けるかもしれません。いつもながらまたーり開発なのでいつになることやら・・・。

 

とりあえず、開発の材料として mplayer の制御について調べてみました。(以下開発メモ)

阿川さん作の Zplayer (mplayerのフロントエンド) や、Zplayer ベースの Quasser Media Player でどうやって mplayer をコントロールしているのか調べてみました。

初めはキー操作をエミュレートしてるのかなと思っていたんですが、mplayer には slave モードという、標準入力からコマンドを受け付けるモードがあるらしいです。

mplayer -slave ファイル名

で、"pause" や "seek 5 2" などのコマンドを標準入力に入れると、mplayer が再生停止やシークを行います。

また、標準入力以外のファイルからもコマンドを入力することができます。

mplayer -input file=XXXX ファイル名

上記の場合、XXXXというファイルからコマンドを入力します。この XXXX に FIFO ファイルを指定することで、フロントエンドからFIFO経由でコマンドを送ることができます。これは便利ですね。

また、制御だけでなく、情報の取得もできます。"get_time_pos" というコマンドを実行すると、標準出力に現在の再生位置(秒数)を出力します。他にも曲の長さ等も取得できるので、これをフロントエンドで拾えば画面表示に必要な情報は取得できるようです。

情報取得系は標準出力に結果を出力するので、-quiet オプションも追加して、余計な出力を抑制すると出力のパースが楽になりそうです。

 

また、録音した flv ファイルを mplayer で再生させるとシークができないようです。

Ubuntu 10.10 の mplayer 1.0rc4-4.4.5 でも同様なので、きっとまだ対応していないのでしょう。再生機能を実装するには必須な機能なので、デバッグしないといけないかなー。

zaurus 用 radiko player 完成!

お待たせしました。radiko player のフロントエンドができました。→ダウンロードページ

といってもかなり簡易的でとりあえず動くレベルです。いつものことながら少しずつ改良しようと思います。

インストールすると、 以下のようなアイコンが追加されます。


radiko player のアイコン

今風に iPhone 風アイコンにしてみました (^^;

アイコンの見た目とは違い、アプリ画面は寂しすぎるくらいシンプルです。


radiko player アプリ画面

コンボボックスでチャンネルを選択し、「Play」ボタンを押すと再生するという、迷いようのない、こだわり抜いたシンプルなインターフェースが特徴です。(ウソですあっかんべー)

再生させてみると分かりますが、mplayer のバッファリングに結構時間がかかるので、「play」を押してから実際に音が出るのは7~8秒くらいかかります。

押してからちょっと不安になるころに鳴り始めますので、心にゆとりを持ってご利用ください。

rtmpdump は結構早い段階でデータを出しはじめるようですが、mplayer がある程度バッファリングするまで再生を開始しないようです。mplayer の初期バッファリングサイズを調整できないか調べてみようと思います。

また、今回リリースした radiko フロントエンドですが、今は放送局IDなどはハードコーディングしてしまっているので、今後 radiko の仕様が変わったときのために、rtmpdump の引数や放送局IDは設定変更できるようにしよう思ってます。 

 

前回のブログのコメントで kanon さんとブースカさんから動作報告を頂き、SL-C700/860/1000/3200 の動作実績ができました。ありがとうこざいました。

さらにブースカさんが mplayer の性能評価を行ってくださいまして、その結果、SL-C700 の normal kernel でも十分実用できるレベルで動作することが分かりました。

これらの結果から、おそらく SL-C シリーズであれば(たぶん SL-6000も)どの機種でも Normal kernel / special kernel 問わず、実用レベルで使用可能と思います。

興味本位で始めた radiko 対応ですが、興味が薄れる前にある程度形になってよかったです (^^;

もう少し作業はありますが、こういう短い単発ネタで一気に作るのは面白いですね。
飽きっぽい正確なので、こういうスタイルの方が性に合ってるのかもしれません (^^;