TSファイルの分割2010/07/19 21:00

 「アナログしか見てないから関係ない、停波したら見なけりゃいいし」などと言っていたのに、地デジを使いまくるようになってしまった。理由は、例の"PT2"を(割高だったけど)手に入れたため。Linux上でも問題ない、というかむしろ使いやすいんじゃなかろうか?
電波強度の問題があってPT2で録画してからの視聴となる(ブースターは高いからなあ)ものの、PT2NASというものを導入したおかげで録画が手間になることはない。実際の視聴はTSファイルがそのまま使えるネットワークメディアプレーヤーを使用。早送りや巻き戻しに難があるけど、画質自体は無問題。

 さて。ところが、たまに視聴できないファイルがある。PT2の動作の問題で、実際の番組開始の20秒前(大抵はCM)から録画開始となっているのだが、このマージンを越えて再生することができないことがある。最後まで表示していた画面が固まったままになったり、画像は止まったままなのに音だけ聞こえたり。同じファイルをLinux上で再生しても、やはり同じ箇所で止まる。ためしに先頭部を適当に削除してみると、問題なく再生できる。
 これは番組が切り替わるときに解像度とかが変わるのに再生側が追随できていないのだろう。mencoderやffmpegでどう扱えばいいのかわからず、またTSファイルについて軽く調べたところわりと簡単にできそうなのでプログラムを組んでみることにした。

 参考にしたのは以下の資料。(リンクにするのもめんどくさい)
http://www.mpeg.co.jp/libraries/video_it/video_03.html
http://www.mpeg.co.jp/libraries/video_it/video_04.html
http://www.mpeg.co.jp/libraries/video_it/video_06.html
http://www.mpeg.co.jp/libraries/video_it/video_07.html
http://allegro.dtiblog.com/blog-entry-185.html
http://allegro.dtiblog.com/blog-entry-187.html
ただこの資料でも(PATの形式などで)どーもアバウトなところがあって、Wikipediaの方が参考になる箇所もあった。
http://en.wikipedia.org/wiki/Program_Specific_Information


 わかったのはおおまか次のようなこと。
  • TSファイル(MPEG2のトランスポートストリーム)は188バイトごとのパケットに分割される
  • パケットのヘッダ部にパケット識別子(PID)というものがある
  • PIDが0のパケットはPAT(Program Association Table) であり、ストリームに含まれている番組(プログラム)の一覧(PMTのPIDとして)をあらわす
  • PMT(Program Map Table)パケットには、その番組に含まれるデータのPID(映像とか音声とか)が入っている。
 手持ちのTSファイルをなめたところ、PATもPMDも(内容が変わらなくとも)何度も繰り返し現れる。放送を前提(つまりはエラーを前提)としての冗長化だから当然であるが。また、途中から再生できないファイルでは、PATやPMDの内容が途中で変わっていた。
 つまり、PATやPMDが変更するタイミングでファイルを分割してやれば、個々のファイルの再生には問題なくなるはず・・・。
 と、ここまで書いて疲れたので、続きはまた今度。

大体できた/セキュリティの懸念など2009/11/29 18:00

Android上でのパスワード管理ツール、機能的には大体完成した。これからのブラッシュアップがまた長かったりしそうだが・・・

  • "ant uninstall"ではアンインストールに失敗する。(送信しているパッケージ名が間違ってる?)"adb uninstall com.XXX.YYY.ZZZ"などとする。実際のパッケージ名はAndroidManifest.xmlに書かれているものと同じ。
  • パスワードのアルゴリズムをSHA1+3DESにしようとしたが、アルゴリズム名"PBEWithSHA1AndDESede"が使用できない。調べたところ、BouncyCastleのモジュールを組み込んでいるらしく、こちらでは"PBEWithSHAAnd3KeyTripleDES"と指定しなければならないようだ。ああ、めんどくさい・・・。OID("1.2.840.113549.1.12.1.3")で指定する方が間違いがないのかな?
  • Dialogの使い方は、リソースを指定して画面を作り、リソースIDからWidgetを引っ張ってくるなど、Activityに近い。おかげで、例えばDialogの戻り値を見てどうこうというのをコード上でシリアルに書けない。そういう思想だというのはわかるが、やっぱりかったるいな。
  • ソースコード上にコメントを書こうと思ったが、Asciiのみで、UTF8を受け付けていない。ant関係の設定ファイルで、わざわざencodingを指定していやがる・・・余計なことを。修正はできるようだが(こちらを参照)、SDKアップデートの度にやらんといけないとは・・・。


いくつか懸念事項があって、どれもセキュリティがらみとなる。例えば、
  • マスターパスワードの情報をどう保存するか?
入力されたマスターパスワードが正しいかチェックするための情報が必要なのだけど、平文で保存は論外。今は自分自身をパスワードとして暗号化して保存しているのだけど、本当はハッシュ値程度で十分。ただそれも、短いパスワードを使用されると簡単に破られるし、ソースを公開する予定だからSalt値もたいして役には立たない・・・。
ちなみに自分が参考にしているPalmOS用のKeyRingでは、Saltを加えたMD5ハッシュ値を使用しているようだ。

ま、もう少し考えてみるとしよう。

Androidプログラミングをもう少し2009/11/24 23:51

 時間がなくてままならなかったけど、連休のおかげでようやく少し進展した。なんとも間のあいてしまったこと・・・まさしく「間抜け」だな。
 開発環境は基本的に以前のとおりUbuntu上で、テキストエディタとant用にコンソールを2つ開き、その他にエミュレータとddms。うーん、デュアルディスプレイが欲しいところだ。ddmsのログ出力がコンソールで見られるとデスクトップ的にはもう少しすっきりするのだが。
 この連休で集中して作業したおかげで、ちょっと楽しくなってきた。特にlayoutなどのリソース回りの理解が進んだ。毎日少しずつ作業しても、なかなかこうはいかないのよね。大きくつまずいたのが、TextEditで文字入力をしようとするとソフトキーボードが立ち上がってきて画面の半分を占め、肝心のTextEdit側が自動的にシュリンクしてしまうという現象(heightをfill_parentにしているため)。リソースでminLinesを設定したり、大元のレイアウトをScrollViewにしたりして解決したのだけど、そこにいたるまでがわけわからなかったな。やはり、リファレンスの出来はよくないと思う。
 以前も書いたように、学習用として、パスワード管理のアプリを作っているのだけど、(当然ではあるが)Javaのセキュリティ関連のライブラリが普通に使えている。パスワードベース暗号というのを使うのだが、とりあえず現状はMD5 & DESでやっている。まあ、SHA & 3DESへの切り替えは問題ないだろう。それ以前のところ、アプリケーションの作りのところでいろいろやることが多いので、苦労している。一応セキュリティがからむアプリではあるしね。
 もう少しで一応はできあがる予定なので、どこかでソースと一緒に公開する予定です。Andoroid Marketは・・・なんかきっついこと言われそうで怖いな〜

三歩目(・・と言うほどではない)2009/07/18 22:25

 まず、アプリのインストールはantから、"ant install" もしくは"ant reinstall"で出来た。このとき、deviceが一つでないとエラーになる。(たとえば、エミュレータが立ち上がってて、実機も接続しているとか)

 いまは、SDKについてきたドキュメントから、サンプルのソースを眺めている状況。リソースのレイアウトで(htmlを書くような感じで)結構画面が作れるのはわかってたけど、そうして作成したwidgetをコード側からどう操作するのかがわからなかった。しかし"DatePicker"でそのあたりがわかった。リソースのIDで管理するのか。リソースを定義するときにXML内でIDをふると、リソースとの橋渡しをする"R.java"の中にそれが反映され、View.findViewByIdで参照することができる・・・というわけか。

 しかしリファレンスが見ずらい・・・。普通のJavadoc形式だとよかったのに。

 まずは(学習も兼ねて)適当なアプリケーションを作ってみよう。難易度が(多分)高くなくて、今の自分に必要なアプリというと、パスワード管理かな。未だにPalmのKeyRingを使っているので、そんな感じのを。Androidに移植もされてるようだけど、情報が少ないのでどうも使う気になれないし、ちょうどいいだろう。画面設計はほとんど踏襲して、ストレージにはSQLite、暗号化パッケージはAndroidでは普通に使えるのかな?

二歩目・実機インストール2009/07/12 15:44

 さて、次は実機への自作アプリインストールのテスト。せっかく買ったんだし。
 まずは実機上、HOME画面でMENUキーを押し、設定->アプリケーション->開発->USBデバッグをオンにする。
 次に開発マシンで、ドキュメントにあるように、ファイル"/etc/udev/rules.d/50-android.rules"を作り、内容を
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4",MODE="0666"
とし、パーミッションを
chmod a+rx /etc/udev/rules.d/50-android.rules
とすればいい・・・というわけにはいかないのだった。少なくても自分の環境(Ubuntu 9.04/AMD64 + HTC-03A)では。
 デバイスが接続されているかどうかは、コマンド"adb devices"で確認できるはずなのだが、実際には何もでてこない。
 調べたり試したりした結果、ファイルの内容をこのようにすればいいとわかった。
SUBSYSTEM=="usb",SYSFS{idVendor}=="0bb4",MODE="0666",OWNER="YOURNAME"
 YOURNAMEには、もちろん、実際のアカウント名を入れる。"ATTR{idProduct}"は必須ではないようだ。
 HT-03Aがつながっていないことを確認し、
adb kill-server
sudo /etc/init.d/udev restart
を実行、再度USBで接続し
adb devices
で、
List of devices attached 
HT96XXXXXXXX	device
と表示される。このHT96...というのがシリアルナンバー。インストール先を指定したりするのに使われる。

 インストールの前にもう一つ。プロジェクトディレクトリにあるAndroidManifest.xmlに手を入れる必要がある。エディタで開き、<application>要素にandroid:debuggable="true"という属性を加え、保存、再ビルド。

 さて、ようやくインストールとなる。エミュレータが起動していなければ前回のインストールと同じだけど、今回はシリアルナンバーを指定して行なってみる。
adb -s HT96XXXXXXXX install bin/HelloActivity-debug.apk 
 成功すれば、後は実機上で動かすだけ。