昔からiPhoneやiPadやらの対応はしなきゃなーと考えていたのだが、 そもそも2万円以下の中華Pad(厳密にはAndroid2.2以降のフルFlash対応Android端末)でも再生できてしまってたので、あんまりやる気がでなかった。
私もいずれiPhoneもAndroidに買い替えるつもりだったし。
しかし....とあるツテで秘密のバイナリを入手したのでパパッとでっちあげることにした。オープンソースでないという理由で公開できないのが玉に傷ですがね。
ま、本当は工作1:iPhoneでワンセグのライブストリーミングといった ような仕掛けを自分で作ればいいのだがどうにもやる気が.....ね。
家庭内のワンセグサーバーにアクセスするのに、 いちいちhttp://IPアドレスとか打ちたくなかったので、 avahi-daemonをいじってApple Bonjour対応にした。 無料iPhoneアプリに ZeroConfSpyというのがあるのでコレと連携するように。
オンエア再生は先に書いた通りHTTP Live Streamingです。ちょっとおかしくてTBSの音声が遅れたり東京MXのTS分離がうまくいっていないけど。
一方で、MP4再生はTSConvrterLinuxとffmpegで真面目にトランスコードするようにしました。最近のffmpegはvpreにipod320のプロファイルが予め入ってるので便利。
エンコードするので遅い反面、端末間のデコーダーの差異の影響を受けにくくなるので、例えばUbuntuのChromeでもそのまま再生できたりするメリットがあります。
調べた限り、Linuxだと良い管理ツールがないみたい。でもPerlにはモジュールがありました。 すごいぞPerl。名前は Image::ExifTool 。 え?Exifってデジカメ静止画用の規格じゃないの??のと思うんですが、 各社のAVCHDファイルにはExifが含まれているらしい。 動画なのに。
インストールはCPAN経由でサクッと入ります。
# perl -MCPAN -e shell > install Image::ExifTool
しかしモジュールなので少しだけコードを書かなきゃならない。以下をexif1とかいう名前で /usr/local/binなどに保存してchmod a+xすると吉。
-----exif1------ #!/usr/bin/perl use Image::ExifTool; use Data::Dumper; foreach my $f (@ARGV) { next if (!-f $f); my $info = Image::ExifTool::ImageInfo($f); print Dumper($info); } -----exif1------
AVCHDムービーをUSBマスストレージでマウントすると、 avchd/bdmv/streamディレクトリに*.mtsという拡張子のファイル があるはず。これがMPEG-TSコンテナの動画ファイルなのね。先ほどのexif1コマンドの 引数にファイル名を指定すると解析できる。
$ exif1 00000.mts [ENTER] $VAR1 = { 'AudioSampleRate' => '48000', 'FileModifyDate' => '2011:11:10 18:06:36+09:00', 'ImageWidth' => 1440, 'AudioBitrate' => '448 kbps', 'ExposureProgram' => 'Program AE', 'ExposureTime' => '1/60', 'VideoStreamType' => 'H.264 Video', 'ShutterSpeed' => '1/60', 'FileSize' => '2024 MB', 'AudioChannels' => '3/2', 'Duration' => '0:17:26', 'Aperture' => '2.8', 'MIMEType' => 'video/m2ts', 'Focus' => 'Auto (0.065)', 'FileType' => 'M2TS', 'ApertureSetting' => 'Auto', 'AudioStreamType' => 'A52/AC-3 Audio', 'FilePermissions' => 'rwxr-xr-x', 'ExifToolVersion' => '8.65', 'Gain' => '15 dB', 'Directory' => '.', 'FNumber' => '2.8', 'ImageHeight' => 1080, 'FileName' => '00000.mts', 'DateTimeOriginal' => '2011:11:10 17:49:11+09:00', 'Make' => 'Sony', 'ImageStabilization' => 'On (0x1f)', 'WhiteBalance' => 'Auto', 'SurroundMode' => 'Not indicated', 'ImageSize' => '1440x1080' };
解像度だけでなく、フォーカスやゲインアップの情報も採れるからけっこう便利かなと思います。
しかし.....いったいこの情報どこに入ってるんだ(?_?)放送TSにはこんな情報はない。 多重化の規格書探したけどISO/IECの範囲にはないようだ。AVCHD独自拡張かな?
昔の商品タグを含むページを表示させようとすると漏れなく腐るね。 友人から俺の「2009年3月の日記一覧が丸ごとでない」と言われて 発覚した。調べてみると、amazon_get内でREXML::Document に食わせるデータになんらチェックをかけていないことが原因だった。 もちろん自分で直しましたけど.......
これは以前もauth proxyが腐ったときに顕在化した仕様。 外部から取り込むデータの正当性チェックを考慮していない。 要するにエラーチェックが足りないわけです。 別にamazon.rbに限ったことじゃなくtDiary全体がそういう感じ。
例外処理というシステムは....確かにコード量を減らしてエレガントに 記述できるかもしれないけど、プログラマの怠慢を加速させる悪パターン であるかもしれないなーと最近思いますね。
HTML5(JQuery Mobile + HTTP Live Streaming)部分の開発はほぼ完了。 番組検索してサムネもでるし、そのままHLSでTS再生もできます。
しかし....某スレがキチガイの巣窟みたいになってて、 アップロードする気力が全くわかない件。 なんでああなっちゃったんだ?数人で開発が回ってた頃は、 本当に良い雰囲気だったんだけどなあ。
そもそも今やり玉にあがってるRTMP対応も、RubyIZUMIを作って くれた人、perlrtmpを作ってくれた人、CygwinやActivePerlで 動かした人、紆余曲折みんなの努力があって、 やっとの思いでワンセグ野郎の形になったのに、 それを老害とか一蹴されたら何も貢献したくなくなる。
外様が、オープンソースに関わる穏当な方法は、 相手の誇りを傷つけないことですね。金儲けでやってるわけじゃ ないんだから。
正確には19日(土曜)。何故か東京都庁の真下あたりにいました。 昼間は暑かったので長袖シャツ1枚だったのだが....夜になると 雨が本降りになり急激に寒くなり....へっくしょい。
待ち人が2時間以上遅れたので、NSビルのタリーズで時間を潰したり、 ヤマダ電機新宿西口店でBluetoothキーボードを買ったりしていた。
同一サイズのディスク間なら、
# dd if=/dev/sda of=/dev/sdb bs=1M [ENTER]
で完全なコピーができる.....そう思っていた時期が私にもありました。
いや正確にはできてはいるらしいのだが、Debian squeezeはある時点で(多分次回ブート時?) 同じUUIDのパーティションを発見すると勝手に書き換えるようなんだ。 これでミラーした方ならともかく、なぜか ブートドライブを書き換えられてしまい 二度とブートせずに鼻血吹くくらい焦った。
勘違いかもしれんけど。なので、UUIDを少し真面目に管理しましょうという話。
マスターHDDのブートパーティションのuuidを控えておく。 コマンドはblkidを使う(vol_idというのもある)。
# blkid /dev/sda1 /dev/sda1: LABEL="system" UUID="faca9b62-b828-32a7-abf6-1500bc4bf56a" TYPE="ext4"
普通にディスクごとコピーする。sdaがコピー元、sdbがコピー先とする。当然これを間違えると、 一発でパーティションごと葬ることが可能なので間違えないように。責任とれないし。
# dd if=/dev/sda of=/dev/sdb bs=1M [ENTER]
終わってもコピー先をマウントしないように。
uuidgenコマンドを使う。ない場合はapt-get install uuid-runtimeを実行しておく。 これもメモっておくなりエディタで保存しておくこと。
# uuidgen [ENTER] 2008a515-dfab-416f-bb14-82f598342936
コピー先を適当なマウントポイントにマウントする。例えば/mnt/root2。
# mkdir -p /mnt/root2 [ENTER] # mount /dev/sdb1 /mnt/root2 [ENTER]
/mnt/root2/etc/fstabをエディタで開き、該当個所を旧UUIDから上記の新UUIDへ変更。 間違えてコピー元の方を変更しないように。
-------/mnt/root2/etc/fstab------ UUID=2008a515-dfab-416f-bb14-82f598342936 / ext4 noatime,errors=remount-ro 0 1 -------/mnt/root2/etc/fstab------
次に/mnt/root2/boot/grub/grub.cfgをエディタで開き、同じ変更を行う。 今度は6個所くらいあるので間違えないように。
-------/mnt/root2/boot/grub/grub.cfg------ search --no-floppy --fs-uuid --set 2008a515-dfab-416f-bb14-82f598342936 (省略) linux /boot/vmlinuz-2.6.32-5-amd64 root=UUID=2008a515-dfab-416f-bb14-82f598342936 ro quiet (省略その他) -------/mnt/root2/boot/grub/grub.cfg------
tune2fsを使う。コピー先のデバイス、かつ、新UUIDを指定。
# tune2fs /dev/sdb1 -U 2008a515-dfab-416f-bb14-82f598342936 [ENTER]
もし/mnt/root2/dev直下にsdb, sdb1などのブロックデバイス用のスペシャルファイルがない場合は、 コピーしておきます。ある場合はやらないでください。
# cp -dpR /dev/sdb* /mnt/root2/dev/ [ENTER]
/mnt/root2に移動して新システムにchrootしておきます。
# cd /mnt/root2 [ENTER] # chroot . [ENTER]
unameでカーネルバージョンを調べて、initramfsを更新します。 この作業は絶対にchrootした状態で実行してください (下手をするとシステム壊します)
# uname -a [ENTER] Linux oneseg2 2.6.32-5-amd64 #1 SMP Mon Oct 3 03:59:20 UTC 2011 x86_64 GNU/Linux # update-initramfs -k 2.6.32-5-amd64 -u [ENTER]
コピー先のシステムに対して、今回変更したgrubを書き込みます。 実際にはgrub.cfgを読み込むのはStage2のはずで、わざわざgrubを書き込む処理は必要ないはずですが、 私が試した限りは実行しないとブートしませんでした。 この作業は絶対にchrootした状態で実行してください (しつこいですが)
# grub-install /dev/sdb [ENTER]
デバイス名が/dev/sdbなのは、chrootしていても現在ブートしているカーネル基準ではコピー先が /dev/sdbだからです。
chrootを抜けて、ディスクをアンマウントして終了です。
# exit [ENTER] (※chroot) # cd / [ENTER] # umount /mnt/root2 [ENTER]
_ クマ三郎 [家具を買う…だと?]
_ ぱ [もう今のマンション10年目だし、そろそろね]