Linuxでワンセグ録画 その4 (TSストリームをMP4ファイルに変換)

前回の続きです。今回はTSストリームから .mp4 へ変換します。

変換するには、TSConverterを使います。TSConverter は元々 Windows のコマンドプロンプト用のソフトですが、Rubber Duckie さんのところで UNIX 系で動かすためのパッチを公開しています。

パッチはここからダウンロードできます。Rubber Duckieさんの2009/5/252009/9/22010/3/4のブログを参考にパッチを当てていきます。

また、Linux では一部ビルドできない部分があったので、簡単なパッチ(TSConverter-linux.patch)を作りました。Rubber Duckieさんの2010/3/4で書かれているバグ修正も入っています。

あと、DtsEdit, MP4Box のフルパスを指定していて、環境変数で変えられるようになっているのですが、勝手に $PATH から探してもらった方が楽なので、フルパス指定を無くしてます。

$ cd ~/project/oneseg/file
$ wget http://theremin.hostoi.com/file/TSConverter_9_01.zip
$ wget http://rduck.web.fc2.com/TSConverter_4_26_patch.tar.bz2
$ wget http://petit-noise.net/system/files/TSConverter-linux.patch
$ cd ..
$ unzip file/TSConverter_9_01.zip
$ cd TSConverter
$ unzip Source.zip
$ tar xf ../file/TSConverter_4_26_patch.tar.bz2
$ cd Source
$ nkf -e -Lu TSConverter.cpp > TSConverter.c
$ mv TSConverter.h TSConverter.h.dos
$ nkf -Lu TSConverter.h.dos > TSConverter.h
$ patch -p1 < ../TSConverter090426.patch
$ patch -p0 < ../../file/TSConverter-linux.patch
$ gcc -o TSConverter TSConverter.c
$ cp TSConverter ~/project/oneseg/bin

 

これで TSConverter はビルドできるのですが、TSConverter は内部で DtsEdit と MP4Box というコマンドを使っていますので、これらもビルドする必要があります。

mp4box は gpac というプロジェクトの一部?らしく、以下でダウンロードできます。

  • http://gpac.wp.institut-telecom.fr/

ただ、ソースのtarballが無いみたいなので、svn checkout して取り出します。

$ cd ~/project/oneseg/
$ svn co https://gpac.svn.sourceforge.net/svnroot/gpac/trunk/gpac

私が checkout したときは r3247 でした。

そのままビルドすると、mp4box コマンドが libgpac.so を必要とするので、単体で実行可能なように libgpac をリンクするように configure します。

$ cd gpac
$ ./configure --static-mp4box
$ make -j5
$ cp bin/gcc/MP4Box ~/project/oneseg/bin

最後のコマンドでバイナリを ~/project/oneseg/bin にコピーしてます。

 

最後は DtsEdit です。

DtsEdit は TSConverter 同様、元々 Windows 用だったのですが、TSConverter同様 Rubber Duckie さんとこで UNIX 系への移植が行われています。

DtsEdit の開発者のサイトはすでに無くなっており、ソースコードを探し回ったところ、sourceforge プロジェクトのrec10の中に取り込まれている事が分かりました。(探すのに苦労しました・・・)

ただし、リリースされている tarball には DtsEdit が含まれていないので、こちらも svn リポジトリから直接 checkout します。

$ cd ~/project/oneseg/
$ svn checkout http://svn.sourceforge.jp/svnroot/rec10/tstools/DtsEdit

私が checkout したときは r862 でした。

Rubber Duckieさんによるパッチはここからダウンロードできます。

$ cd ~/project/oneseg/file
$ wget http://rduck.web.fc2.com/DtsEdit_20081009_patch.tar.bz2
$ cd ../DtsEdit
$ mkdir patch
$ cd patch
$ tar xf ../../file/DtsEdit_20081009_patch.tar.bz2
$ cd ..
$ for file in src/{*.cpp,*.h}; do echo $file; nkf -wd $file > $file.tmp; mv $file.tmp $file; done
$ cd src
$ nkf -w ../patch/DtsEdit.patch | patch -p1
$ rm stdint.h

このままビルドすると、libgpac.so が無いと言われてビルドに失敗するので、前でビルドした libgpac_static.a をスタティックリンクしてしまいましょう。

Makefile を以下のように変更します。

DtsEdit: $(OBJS)
#    $(CPP) -o $@ $(OBJS) -lgpac -L/usr/local/lib
    $(CPP) -o $@ $(OBJS) ../../gpac/bin/gcc/libgpac_static.a -lz -L/usr/local/lib

乱暴にパス指定してリンクしてしまいます。gpacのディレクトリは適当に変更してください。

これで DtsEdit がビルドできます。

$ make
$ cp DtsEdit ~/project/oneseg/bin

長かったですが、これでようやく TSConverter が使えるようになります。

色々ビルドしましたが、~/project/oneseg/bin の下は以下のような感じになっていると思います。

$ ls ~/project/oneseg/bin/
DtsEdit  MP4Box  TSConverter  dvbstream  mplayer

ここにパスを通して、以下のようにTSストリームをダウンロードし、mp4ファイルに変換できます。

$ export PATH=~/project/oneseg/bin:$PATH
$ dvbstream -c 0 -f `expr 21 \* 6000 + 395143` 8192 -o > test.ts
-----省略------
^CCaught signal 2 - closing cleanly.
$
$
$ TSConverter test.ts
AVC-H264 import - frame size 320 x 180 at 14.985 FPS
AVC Import results: 190 samples - Slices: 8 I 182 P 0 B - 190 SEI - 8 IDR
AAC import  - sample rate 24000 - MPEG-4 audio - 2 channels
Saving /home/tomo/project/oneseg/test.mp4: 0.500 secs Interleaving
$

これで test.mp4 が生成されます。あとは適当なプレイヤーで再生するだけです。

試しに zaurus の mplayer (attyさん作) で再生させてみたところ、映像のデコードが間に合わないみたいですね。H264のデコードは zaurus では QVGA サイズでも厳しいようです。

Android携帯のHTC Desire (X06HTII) で再生してみたらちゃんと再生できました。これで通勤中に録画したワンセグを見ることができそうです。

長いくせに興味ない人にはつまらないエントリですいません ^^;


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を抜き出します。