Sunday, December 20, 2009

player.pl差し替え版2009/12/17が出た

sqlite版を使用していて油断している間にmsnがサイトと表示構成を変更したため、player.pl差し替え版が表示されないようになっていたらしい。早速2009/12/17版が出ていました。すばやい。
番組変更や、ワンセグ独自番組がある場合はsqlite版が良いのだけれど(あと、録画が停止した場合に気づきやすい)、msn版の方が番組内容が詳しいので、便利ですね。あと、sqlite版だと、空気を読まないNHKが独自に"<終>"みたいなのを入れて、いちいち対応するのが邪魔くさい。民放なら皆"[最終回]"とするところですけど、足並みを乱しますね、NHK、どういうつもりでしょうね。

Saturday, November 28, 2009

IXY920IS


一年前発売のIXY920ISを買った。CANONのカメラは初めて。色出しが気に入らないので避けてきたが、CHDKを使えば、RAW撮影や多段ブラケット撮影が出来るということで、発売当時の半額くらいだったし、試しに買ってみた。(IXY930ISはCHDK未対応)
CHDKは、入れるのは簡単ながら出来ることが多すぎてマニュアルを読むのが億劫。RAW撮影、多段ブラケット撮影は一応出来るようになった。すばらしい。
後の機能はそのうちゆっくりとマニュアルを読みます。
ちなみにIXYシリーズでCHDKが対応しているのは今のところ、
SD30 IXY DIGITAL L3
SD300 IXY DIGITAL 50
SD400 IXY DIGITAL 55
SD450 IXY DIGITAL 60
SD500 IXY DIGITAL 600
SD550 IXY DIGITAL 700
SD600 IXY DIGITAL 70
SD630 IXY DIGITAL 80
SD700 IXY DIGITAL 800IS
SD750 IXY DIGITAL 90
SD800 IXY DIGITAL 900IS
SD850 IXY DIGITAL 810IS
SD870 IXY DIGITAL 910IS
SD880 IXY DIGITAL 920IS
SD890 IXY DIGITAL 820IS
SD950 IXY DIGITAL 2000IS
SD990 IXY DIGITAL 3000 IS (beta)
SD1000 IXY DIGITAL 10
SD1100 IXY DIGITAL 20IS
です、多分。 持っている人は試してみるのが吉。

Friday, October 9, 2009

エナクルの前照灯、球切れ。


理想の「シティーコミューター」、サンヨーエナクルのヘッドライトが球切れした。これで2度目。
最初に切れたとき、調べてみたところ24V5WのE10は、エナクル純正以外ではなかなか手に入らないらしい。
仕方なく、応急でパイロットライト用電球をマルツで買った。E10の口金のパイロットライトで24V用は0.11Aでヘッドライト用には、さすがに暗いと思い、18V,0.11Aを試した、2個で150円程。
純正品より少し明るくなったので、すぐ切れるだろうと思っていたが、球が当たりだったのか、結局そのまま一年以上。今回はその残りの1個と交換。今回も一年以上使えるだろうか。

Wednesday, September 30, 2009

アクセシビリティ、または24時間ワンセグ野郎字幕対応

jw flv player のページを見ていて、プラグインで字幕を表示できることを知った。
字幕 xml ファイルを用意して試してみると、UTF-8 を用いれば日本語も問題ないようだ。
正攻法では、ぱぱネット(仮)様製作によるdumpeitを改造して、標準入力からTSファイルを流し込むと字幕XMLを吐くプログラムをつくり、segwrapper.pmで切り出したTSファイルを流し込むというところだろうが、根性と技術の問題で断念。

dumpeitをそのまま使い、TSファイルから前もってSUBファイルを作成しておく。
一時間に一度TSファイルを処理するようにしておくとよいでしょう。EITファイルは不要。
caption.plにファイル名を渡してキャプションを受け取るようにplaye.pl差し替え版を改造。
改造箇所は、
print "s1.addParam('flashvars','file=$request.flv&streamer=rtmp://$ENV{'SERVER_NAME'}/vod&fullscreen=true&plugins=captions-1&captions.file=caption.pl?file=$request.xml');\n"
みたいなところ、何箇所かある、いつも使っている部分だけでもOK、どこを使っているかわからない人は全部書き加える。

caption.pl はここ。 caption.090930.pl を caption.pl と改名して、player.plと同じディレクトリにおく。
caption.pl の最初のほうの設定を環境に合わせて変更する。
  • $TSFOLDER : SUBファイルの置き場所
  • $Tadj : 字幕表示開始時刻の調整
  • windowsの人はパス名の/を\にするなどの工夫が必要。($TSFOLDERと$subfileのところ)

時間跨ぎ、日付跨ぎなどは、未確認。
字幕表示時間は有無を言わせず5秒。
同一時刻の字幕は行を増やして表示。
# 日付跨ぎ字幕番組を発見してちょっと試してみたらだめだった。
# 多分サブルーチンで手抜きをしたのが原因。
# 軽く修正 090930a版
# mod_perlを使っていない人はCGI.pmがやたら重いらしいのでCGI.pmを省いた。
# さらに修正、および特殊文字の辞書ファイルを用いるように改変091001版
# SUBファイルの途中から番組が開始する場合、頭のほうを読み飛ばせない問題を修正.091001a版
# さらに修正091002版

Saturday, September 26, 2009

Thursday, September 24, 2009

player.pl差し替え版sqlite3対応版090924

もうそろそろ安定でしょうか。
ジャンル検索の複数条件をORで結んでいるがANDにするか思案中。
-090924-
streamdisp() からのファイルダウンロード時に、ファイル名にアイコン名などが入る問題を修正。
地味にジャンル検索を変更。
ActivePerl 5.10.0 build 1004 以前ではうまく動かない可能性があるようです。
DBD-Sqlite を1.25に上げてみて、それでもだめなら ActivePerl 5.10.0 build 1005 以上を使ってみてください。


090924a 版

# 番組内容のアイコンが表示されない問題をこっそり直した。
# アイコン名をこっそり変更した。
# define.plのアイコン辞書もこっそり一文字変更した。

090924b版
# 検索結果の番組詳細でアイコンが出なかった問題を修正
## 上記は修正されていなかった。

segwrapper.pm の脱 inverse_julian_day 化

player.pl 差し替え版から呼び出される segwrapper.pm はTime-modules の inverse_julian_day を使うため、ActivePerlで使う場合にややこしい手続きが必要らしい。
OneSeg24ForLinux の rec.pl の一部を移植して脱 inverse_julian_day できるはず。

*** segwrapper.pm.orig Wed Sep 23 00:00:00 2009
--- segwrapper.pm Wed Sep 23 00:00:01 2009
***************
*** 4,10 ****

use strict;
use Time::Local;
! use Time::JulianDay;
use Fcntl;


--- 4,10 ----

use strict;
use Time::Local;
! #use Time::JulianDay;
use Fcntl;


***************
*** 37,43 ****
my $totcode = shift;
my($mjd,$y,$m,$d,$h,$n,$s,$ch,$cn,$cs);
($mjd,$ch,$cn,$cs) = unpack("nCCC",$totcode);
! ($y,$m,$d) = inverse_julian_day($mjd+2400000.5+1); # @@@ +1?
$h = (($ch >> 4) & 0x0F) * 10 + ($ch & 0x0F);
$n = (($cn >> 4) & 0x0F) * 10 + ($cn & 0x0F);
$s = (($cs >> 4) & 0x0F) * 10 + ($cs & 0x0F);
--- 37,54 ----
my $totcode = shift;
my($mjd,$y,$m,$d,$h,$n,$s,$ch,$cn,$cs);
($mjd,$ch,$cn,$cs) = unpack("nCCC",$totcode);
! # ($y,$m,$d) = inverse_julian_day($mjd+2400000.5+1); # @@@ +1?
!
! $y = int(($mjd - 15078.2) / 365.25);
! $m = int(($mjd - 14956.1 - int($y * 365.25)) / 30.6001);
! $d = int($mjd - 14956 - int($y * 365.25) - int($m * 30.6001));
! if (13 < $m) {
! $y = $y + 1;
! $m = $m - 12;
! }
! $y = $y + 1900;
! $m = $m - 1;
!
$h = (($ch >> 4) & 0x0F) * 10 + ($ch & 0x0F);
$n = (($cn >> 4) & 0x0F) * 10 + ($cn & 0x0F);
$s = (($cs >> 4) & 0x0F) * 10 + ($cs & 0x0F);

Wednesday, September 23, 2009

player.pl差し替え版sqlite3対応版090923

寝る前までの修正 こちら
-090923-
<player.pl>
【ほげ】をすべてアイコンに変換する野望は捨てた。
system()が残っていたので、Win32::Process::Create()に戻した.
放送局名をgoogleのI'm Feeling Lucky機能にリンクした。
番組表をキャッシュするようにした.
- 当日はキャッシュしない.
- Cacheファイルは放送日のタイムスタンプが付くので, define.pl の $ExpireCache を ($start_date-2)*24 にすると、丁度,最初の日以前をexpireする。
表の最後を揃えて放送局名を入れた。
<defin.pl>
「絵」アイコン追加。icon_e_b.gif
「SS」アイコン追加。icon_ss_b.gif
「シリーズ構成」アイコン追加。icon_kousei_b.gif
「終」アイコン追加。icon_end_b.gif
「声の出演」を「声」アイコンに関連付け。
「リポーター」アイコンを変更。
キャッシュ化に伴い$ExpireCache = ($start_date-2)*24;に。
<omake/ts_epg.pl>
ts_proc.pl はパイプを使うのでepg.plを改造して
直接ファイルを読んで処理するようにした。
キャッシュ化したので、設定を変更した場合はcache\の内容を削除することを忘れずに。
ジャンル検索でSQLのエラーが出ることがあるようですが、いまのところ原因不明。

Sunday, September 20, 2009

player.pl差し替え版sqlite3対応版090920

-090920-
$startHを跨ぐ番組を表頭にも表示するようにした。

Saturday, September 19, 2009

player.pl差し替え版sqlite3対応版090919

寝る前までの修正。
-090919-
$startHを跨ぐ番組が表示されない問題の修正。(epg.cgiのせいではなく、改造時のエンバグだった。)
本家09/14版から、
streamdisp_mobileでmp4ダウンロードできるようにした。
海の日の修正。
-090918-
検索での時刻指定に関するバグ修正。
ts_proc.plのTSファイル名生成に関するバグ修正。

Thursday, September 17, 2009

player.pl差し替え版sqlite3対応版一応公開

player.pl差し替え版の作者の方が、スクリプトに手を入れることを歓迎ということで、手を入れて無茶苦茶にしてしまったスクリプトをきれいにしてくれる人歓迎ということで、公開してみることにした。こちら

player.pl sqlite対応版

player.pl 差し替え版に OneSeg24forLinux の epg.cgiの番組表生成部を移植しました。
どうしてうごいているのか分からないほどのスパゲッティになりましたが、
一応、Unix系では普段使うところは動いています。
windows用に書き戻しましたが、作成者はwindowsで使用していません。
windowsで動かすのに必要な事項が抜け落ちている可能性がありますので、
なんとか対応して結果を知らせてください。

Wednesday, September 16, 2009

ニッカンスポーツコムの番組表終了

ニッカンスポーツコムのテレビ番組表が9月末で終了するらしい。
player.pl差し替え版が使えなくなるので、あわててサボっていたepg.cgiに検索、エンコード機能を付加しようと思ったが、player.pl差し替え版をsqlite対応にすることにした。(そのほうが楽そうだったから)
どうして動いているのかわからないほどのスパゲッティ具合だが、普段使うところは完成! と思ったらplayer.pl差し替え版がMSN TVに対応したようで、またMSN TVが使えなくなるまでは放置。
sqlite版の弱点は受信状態が悪いと番組表が阿鼻叫喚の地獄絵図となること。
また、ニッカンのジャンル分けとワンセグ放送付加情報のジャンル分けが少々異なっているので混乱する。ニッカンの「バラエティ」の「バラエティ」って何?
ニッカンでは「趣味・教育」で「旅」と「釣り」が分かれているがワンセグでは「旅・釣り・アウトドア」となっている。「歴史」「科学」はワンセグにはなく「ドキュメンタリー」の方に「宇宙・科学・医学」と「歴史・紀行」がある、ただし「歴史・紀行」はニッカンの「ドキュメンタリー」にも存在する。などややこしい。

# これを機会にデータベースファイルの古い情報を消去するスクリプトも書いた。

#!/usr/bin/perl
use DBI;
$start_date = 28;
@tm = localtime(time-86400*($start_date-1)-3600);
$timestring = sprintf("%04d-%02d-%02d %02d:00:00",$tm[5]+1900,$tm[4]+1,$tm[3],$tm[2]);
my $dsn = 'DBI:SQLite:dbname=/media/disk/oneseg24/epg.db';
my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 1, AutoCommit => 1});
$dbh->do("delete from da_genre where dv_id IN (select dv_id from da_event where dv_start_time < '$timestring')");
$dbh->do("delete from da_event where dv_start_time < '$timestring'");
$dbh->do("vacuum");
$dbh->disconnect();

Wednesday, September 2, 2009

TSConverter_9_01

テルミンさんのTSConverterがバージョンアップ。0426版のパッチがリジェクトなしで当たったが、重要な変更がコメントアウトしてしまったコード内にあるかもしれないので不安。一応動いたが、不具合に遭遇していないのでなんとも。

Friday, August 28, 2009

ぱぱネット(仮)さんのperlrtmp改造

perlrtmpに複数から使用していて、一方が無線LANで通信が滞りがちになると、他方の接続にも影響する。
なので、perlrtmpをinetd対応に改造しようかと思っていたところ、ぱぱネット(仮)様が、接続ごとに子プロセスに分ける改造をされていたので、いただいた。多謝。
その他にもいろいろ改造されたようだが、とりあえず子プロセスの部分だけ頂くことに。必要なのはperlrtmp.pl のみ。これを少々書き換えてserver.plとして使用すると、一方の接続の停滞に影響されないようになったようだ。いまのところゾンビも発生せずうまくいっている。多分接続数増加への耐性も上がっているだろう。

--- perlrtmp.pl 2009-07-25 09:51:05.000000000 +0900
+++ server.pl 2009-08-28 23:46:31.000000000 +0900
@@ -8,15 +8,14 @@
use POSIX ":sys_wait_h";

my $dir = $ARGV[0];
-my $port = $ARGV[1];
-my $dbn = $ARGV[2];

-if ($dir eq '' || $port eq '') {
- die "Usage: $0 <document> <server> <session>\n";
+if ($dir eq '') {
+ die "Usage: $0 <document>\n";
} else {
$dir =~ s/\/$//;
}

+my $port = '1935';
my $lsn = new IO::Socket::INET(Listen => 1, LocalPort => $port, Reuse => 1) or die;
my $sel = new IO::Select($lsn);

@@ -31,7 +30,7 @@
warn "[socket] connect from ", $new->peerhost, "\n";
$pidtable{$pid} = 1;
} elsif (defined $pid) {
- my $rtmp = RTMP->new($new, $dir, $dbn);
+ my $rtmp = RTMP->new($new, $dir);
my $cosel = new IO::Select($new);

while (1) {

Sunday, August 23, 2009

1.5TB HDD

USB接続している1.5TB-HDDがスピンアップしなくなった。別マシンに直接つなぐとスピンアップしたが、fsckでエラー。調子の悪いハードでいろいろ書き換えるのは怖いので別HDDにddでコピー。デフォルトのbs=512だったこともあり、5日と10時間かかった。恐るべし、テラバイト時代。

Monday, August 10, 2009

perlrtmpバージョンアップとBonDriver対応ワンセグチューナー

  1. perlrtmpがflashplayer10のバージョンアップに伴いバージョンアップしたようです。入れ替えるだけでOK. なんらかの都合でlib/segwrapper.pmを使用している人はコピーしておくことを忘れずに。
  2. BonDriver対応のワンセグチューナーをたまたま持っていたのでWindowsでts.pl,rec.plを使って「ワンセグ野郎形式」ファイルをつくってみた。オリジナルよりサイズがちょっと大きくなるけどperlrtmpで使用できた(BonDriverが何かを加えているらしい)。 Windowsではパイプの処理をCMD.EXEが担当するようで、ts.plからbonDriverを使ってtsを吐くプログラムを動かすとDOS窓がチューナー分開いたままになるのが不細工。CMD.EXE互換で窓を開かないプログラムはないものか。

Sunday, June 28, 2009

サーバー故障

D945GCLF2がお亡くなりになった。そもそも買ったときに立ち上がらず不良品交換してもらった物。ロットが悪かったのか。ショップの保証は切れたので、後はINTELの保証か。保証書なくしたかも。
修理には時間がかかるだろうから、あわててR11S4MI-BAを買ってきた。またもAtom330。 同じチップなのでドライバもそのまま、fstabを書き換えたくらい。
あと、Player.pl差し替え版を6/19版にした。

Sunday, May 31, 2009

player.pl差し替え版の動画切り出しについて。

24時間ワンセグ野郎で動画を切り出す場合、たいていは番組の一部だけなので、時刻を5秒単位で指定して切り出したいのだけれど、player.pl差し替え版では分単位でないと切り出せないようになってる。
そこでplayer.pl 167行目
$stim = "$h:$m:00";

$stim = "$h:$m:$s";
に、169行目
$etim = "$h:$m:00";

$etim = "$h:$m:$s";
にしてみた。 $s をわざわざ計算しながら0秒にしているのは何か理由があるのかもしれないが、いまのところ不具合はない。

Monday, May 25, 2009

TSConverter_4_26, FreeBSD(多分Linuxも)パッチファイル


Blogger.com的にはどうしたらいいのかわからなかったので、FC2に置かせてもらいました。
こちら
DtsEditへのパッチも置いてあります。作者のみなさまに感謝。
# あとは、player.pl差し替え版5/13版へのパッチだったか、、ファイルを綺麗にするのが手間なのでまた次の機会に。

Tuesday, May 19, 2009

TSConverter_4_26、FreeBSDへ移植できたんですけど...

テルミン氏のTSConverter 2009 04/26版をFreeBSDでコンパイルできた。なかなかスマートにいかずdiff -uで550行ほどになってしまったので、ここに書き込むのは断念。
どこかよきところに置きたいが、blogger.com的にはどうすりゃいいかよく分からん。移植というかんじになったので、作者の許可も要るでしょう。ので、欲しい人は連絡を。(要DtsEdit,mp4box.多分LINUXでもOK)

Sunday, May 17, 2009

player.pl差し替え版、2009/5/13 安定版 でた。


player.pl差し替え版、2009/5/13 安定版が出ていました。OneSeg_Extructが不要になり、operaにも対応して頂けたようです。UNIXで動かすには"\\"を"/"にすることと、Win32::Processで書かれているところをsystemやfork,execで何とかすることくらいか。
TSConverterも更新されているようですが、移植が手間なのでまだ手が出ず3/22版のまま。

Saturday, April 18, 2009

MAXXON ワイヤレスブレーキライト


xx円以上送料無料にあと少し足りない、などという場合、つい必要の無いものを買ってしまいがちだが、これはなかなかよかった。MAXXONの自転車用ブレーキライト。
加速度センサが入っていて減速時に点灯する。
モードは点滅→点灯、点灯→明るく点灯、消灯→点灯の3種。多分振動を検知して30秒走行すれば自動で電源ON。4分静止で電源OFF、とのこと。
PACIFIC-18に付けてみたところ付属のアタッチメントの一番太いやつがシートポストにジャストフィット。段差を越えるときなどにも点灯するが、だいたいブレーキライトっぽく点灯する。
問題はリフレクターが付いていないので、別につける必要があること。

Friday, April 3, 2009

DtsEditのコンパイル(FreeBSD,多分Linuxも)

DtsEditはほとんどソースを変更することなくコンパイルできます。
手順
> mkdir DtsEdit
> cd DtsEdit
> unzip ../DtsEdit_src20081009.zip
  • 一部ファイルを削除する。
> rm stdint.h
  • 文字コード、改行コードを変更する。
> nkf -e -Lu hoge.cpp > hoge.cpp.euc
> mv hoge.cpp.euc hoge.cpp
  • てな感じですべてのcpp,hファイルを変更する。
  • じゃまくさいので、スクリプトで

    #!/bin/sh
    NKF=/usr/local/bin/nkf
    for file in `ls ./DtsEdit/*.cpp ./DtsEdit/*.h`; do
    echo "converting "$file
    ${NKF} -e -Lu $file > $file".euc-unix"
    mv $file".euc-unix" $file
    done

  • パッチファイル。同じ文字コード、改行コードで作成。

    diff -urN DtsEdit.orig/EditMain.cpp DtsEdit/EditMain.cpp
    --- DtsEdit.orig/EditMain.cpp 2009-03-06 22:32:51.000000000 +0900
    +++ DtsEdit/EditMain.cpp 2009-03-06 00:47:09.000000000 +0900
    @@ -54,6 +54,7 @@
    qsort(tsSort, mi.ui_sampleCount, sizeof(T_TS_LIST), (int(*)(const void*, const void*))CompareTS_PTS);

    // 最終フレームのFPS補完
    + {
    u32 i = mi.ui_sampleCount;
    tsSort[i].DTS = ts[i-1].DTS + (ts[i-1].DTS - ts[i-2].DTS);
    tsSort[i].CTS_Offset = 0;
    @@ -266,6 +267,7 @@
    goto _ERROR_RET;
    }
    }
    + }


    _ERROR_RET:
    diff -urN DtsEdit.orig/EditMain.h DtsEdit/EditMain.h
    --- DtsEdit.orig/EditMain.h 2009-03-06 22:32:51.000000000 +0900
    +++ DtsEdit/EditMain.h 2009-03-05 22:54:33.000000000 +0900
    @@ -3,7 +3,7 @@

    #pragma once

    -#define MODE_IN 0x00000001ui32
    -#define MODE_OUT 0x00000002ui32
    +#define MODE_IN ((ui32)0x00000001)
    +#define MODE_OUT ((ui32)0x00000002)

    void EditMain(T_EDIT_PARAM *prm);
    diff -urN DtsEdit.orig/Makefile DtsEdit/Makefile
    --- DtsEdit.orig/Makefile 1970-01-01 09:00:00.000000000 +0900
    +++ DtsEdit/Makefile 2009-03-05 22:54:33.000000000 +0900
    @@ -0,0 +1,17 @@
    +# Makefile for DtsEdit
    +CPP = g++
    +OBJS = DtsEdit.o EditMain.o Help.o common.o
    +#
    +DtsEdit: $(OBJS)
    + $(CPP) -o $@ $(OBJS) -lgpac -L/usr/local/lib
    +#
    +.cpp.o:
    + g++ -c $< -I /usr/local/include -I ./
    +#
    +clean:
    + @rm -f DtsEdit *.o *~
    +#
    +DtsEdit.o: stdafx.h Help.h EditMain.h windows.h
    +EditMain.o: stdafx.h Help.h EditMain.h debug.h
    +Help.o: Help.h
    +common.o: stdafx.h Help.h debug.h
    diff -urN DtsEdit.orig/common.cpp DtsEdit/common.cpp
    --- DtsEdit.orig/common.cpp 2009-03-06 22:32:51.000000000 +0900
    +++ DtsEdit/common.cpp 2009-03-05 22:54:33.000000000 +0900
    @@ -1,5 +1,5 @@
    #include "stdafx.h"
    -#include "help.h"
    +#include "Help.h"
    #include "debug.h"

    // 最大公約数の取得
    diff -urN DtsEdit.orig/stdafx.h DtsEdit/stdafx.h
    --- DtsEdit.orig/stdafx.h 2009-03-06 22:32:51.000000000 +0900
    +++ DtsEdit/stdafx.h 2009-03-06 22:34:42.000000000 +0900
    @@ -3,6 +3,7 @@
    // を記述します。
    //

    +/*
    #pragma once

    #ifndef _WIN32_WINNT // Windows XP 以降のバージョンに固有の機能の使用を許可します。
    @@ -12,8 +13,23 @@
    #include <windows.h>
    //#include <stdio.h>
    //#include <tchar.h>
    +*/

    // TODO: プログラムに必要な追加ヘッダーをここで参照してください。
    +#include <stdio.h>
    +#include <strings.h>
    +#include <unistd.h>
    +#include <sys/types.h>
    +typedef int BOOL;
    +typedef __uint32_t ui32;
    #include <gpac/isomedia.h>
    #include <gpac/internal/isomedia_dev.h>
    #include "common.h"
    +
    +#define ZeroMemory(ptr,size) memset(ptr,0,size)
    +#define _stricmp(str1,str2) strcasecmp(str1,str2)
    +#define GetFileAttributes(path) ((__uint32_t)access(path,F_OK))
    +#ifndef FALSE
    +#define FALSE 0
    +#define TRUE 1
    +#endif
    diff -urN DtsEdit.orig/windows.h DtsEdit/windows.h
    --- DtsEdit.orig/windows.h 1970-01-01 09:00:00.000000000 +0900
    +++ DtsEdit/windows.h 2009-03-06 22:27:43.000000000 +0900
    @@ -0,0 +1 @@
    +//
  • patchをあてる。スペースとかタブがうまく投稿できてないので。
> patch -l -p < DtsEdit.patch
  • makeする,これも投稿の問題で、Makefileのスペース8個をタブに書き換えてください。
> cd DtsEdit
> make
  • できあがり、のはず。
ソースファイルの投稿は難しい、うまく書き込めてなかったらお知らせください。しかし、スペースとかタブとかどんどん書き換わるのはなんとかならんのか。みんなはどうしているのでしょう。

Thursday, April 2, 2009

OneSeg_Extract簡易版

player.pl差し替え版でmpeg4ファイルを作成する場合、Oneseg_Extract.exe、TSConverter.exeを呼び出す。Wineで動かしたいところだが、どちらもウインドウを開こうとするためhttpサーバから起動するのは色々厄介。TSConverterは内部からDtsEdit.exeとMP4Box.exeを起動するのだが、これらはウインドウを開かないのでWineから動かすことができる。
なので、Oneseg_Extract.exeとTSConverter.exeさえ移植すれば何とかなるわけだが、MP4Boxはportsからインストールできるし、DtsEditの最新版のソースをseraphy@管理人様に公開していただいたので、いい加減ながら移植した。
今回はとりあえずOneseg_Extractほぼ互換perlスクリプトだけ。
segwrapper.pmを使用したので簡単。最初の方の時刻関係は無くてもいいかも。
-- Oneseg_Extract.pl --
#!/usr/bin/perl
#
use Time::Local;
#
# path to "segwrapper.pm"
use lib '/usr/local/perlrtmp/lib';
use segwrapper;
#
my $outputfile=$ARGV[$#ARGV];
if($outputfile=~/(\d{6}-\d{6}-\d{6}-\d\d)\.ts$/){
  my $inputfile=$1;
  $outputfile=~/(\d{2})(\d{2})(\d{2})-\d{6}-(\d{2})(\d{2})(\d{2})-\d\d\.ts$/;
  if(time>timelocal($6,$5,$4,$3,$2-1,$1+2000)){
    my $opt = O_RDONLY | O_BINARY;
    eval { $opt |= O_LARGEFILE; };
    open(OUT,"> $outputfile") or die("can not open $outputfile for write");
    binmode(OUT);
    segwrapper::segopen(my $handle, $inputfile, $opt);
    my $packet_size = 4096;
    while(segwrapper::segread($handle, my $buf, $packet_size)) { print OUT $buf; }
    segwrapper::segclose($handle);
    exit;
  }
}
print "no record\n";
exit(-1);
残りはまた今度。

Wednesday, March 25, 2009

REALFORCE


新キーボードが届いたので繋いでみた。 タッチはなかなかよい。 チルダ、エスケープ、デリート、バックスラッシュの位置に少々とまどうが、ファンクションキー、矢印キーが独立しているのは便利。ただ、でかい。机の上が狭くなってしまった。HHKに戻すかどうか悩みどころ。

Thursday, March 19, 2009

player.pl差し替え版非対応ブラウザ

普段WebブラウザはOPERAをつかっているのですが、player.pl差し替え版20090301はOPERAではうまく再生できません。Safariもダメなようです。
--- player.pl~ 2009-03-01 23:12:10.000000000 +0900
+++ player.pl 2009-03-03 23:12:10.000000000 +0900
@@ -514,6 +514,7 @@
&get_shot($request);
}
&htmlhead();
+ $hA=70;$xA=18;
if($brtype eq 2){ #Chrome
$hA = 70;
$xA = 16;

みたいなかんじでデフォルトの値を適当に決めておけば、OKです。

Tuesday, March 17, 2009

PT1を買った


ワンセグをBSDの方に任せたので、Windowsでフルセグ録画をすることにした。

Tuesday, March 3, 2009

HHK復活


ここ2,3ヶ月、キーボード(HHK)のファンクションキーが効かなくなってきていた。もともとSUNのSS10につないでいたキーボードだが、SS10,SS20の退役とともにWindowsに降りてきて、以来Windowsにつないでいる。WindowsではXKeymacsをつかっていてもファンクションキーが必須で、使えなくなると特にかな漢字変換で難渋する。古いキーボードなので、とうとう寿命かと思い新しいキーボードを手配したが、O君が言うのには、接点のシートにゴミかなんかが挟まってるのではないかとのこと。然もありなんと購入後初の分解掃除を行った。ラバーシートの上にはびっくりするほどの埃がたまっており、接点シートの間にも細かいゴミがファンクションキー接点あたりに入り込んでいた。ゴミや埃を除いて組み立てると、あら不思議。ファンクションキーが生き返った。1997年4月製とあったから、また十年掃除なしで使えるのだろうか。恐るべしHHK. で、発注したキーボードはどうしましょ。

Tuesday, February 24, 2009

epg.cgi, player.pl差し替え版look




OneSeg24 for Linux 付属epg.cgiにplayer.pl差し替え版のcssやカレンダーのjavascriptを移植して、それっぽくしてみた。
一見player.pl差し替え版にみえるが、放送中や未放送の部分をみると



時間指定や検索は未実装。

Monday, February 2, 2009

24時間ワンセグ野郎引越

いままでWindowsで動かしていた24時間ワンセグ野郎を自宅サーバーのマザーボード交換に伴いCPUパワーもアップしたことからFreeBSDへ引っ越した。
チューナーもLOG-J100からDUS-01へ変更。
UGEN経由のプログラムをここにあるとおりに書いてみた。SIGTERMとかの処理はさぼっているが(録画用perlプログラムからSIGTERMがやってくる)、一応動くようなのでOKということで。ただ、USB2.0ハブを通すと動かないのでK師匠に相談したところ、FreeBSD StableのEHCIドライバではUSB1.1のアイソクロナス転送がまだサポートされてないとのこと。引き出しの奥からひっぱり出してきたUSB1.1ハブにUSB2.0を2つ繋ぎ、そこにチューナーを8つ繋ぐことになった。
録画プログラムはOneSeg24 for Linux
を使用。dvbstreamのかわりに自作プログラムを使うので、オプション -c (num) で/dev/ugen(num) を使用するように、また -f で周波数設定 -o は無視してデフォルトで標準出力にTSを吐き出すようにした。
再生はperlrtmp(これもFreeBSD側に引越)とOneSeg24 for Linux付属のepg.cgi+player.cgiまたはplayer.pl差し替え版を使用、mp4変換や再エンコード機能は殺しているが今のところ必要なし。
今回はアンテナを分配器から鰐口クリップで接続したので、安定して録画できている。いやあ便利。
プログラムの作者のみなさんに感謝。
# その後1ヶ月分のTSファイルをWindowsからSAMBA経由でコピーするのに2日。

---
dus-01用手抜きプログラムFreeBSD版、ご自由にお使いいただいてかまいませんが、ご自分の責任で。
---

#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <dev/usb/usb.h>

#define TS_PACKET_SIZE 188
#define CMD_LEN 10
#define RET_MAX 3

char *ugenNum = "0";
int EP0,EP1,EP3;

unsigned char channelCmd[]={ 0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char chkRecCmd[] ={ 0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char mpgOnCmd[] ={ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char mpgOffCmd[] ={ 0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

int chkVnd()
{
struct usb_device_info udi;

if(ioctl(EP0,USB_GET_DEVICEINFO,&udi)<0){
perror("chkVnd");
return 0;
}
if(udi.udi_vendorNo != 0x1bc8 || udi.udi_productNo != 0x0001)
return 0;
return 1;
}

void wrCmd(unsigned char *cmdArr)
{
if(-1==write(EP1,cmdArr,CMD_LEN)){
perror("wrCmd");
}
}

void rdRet(unsigned char *retArr)
{
if(-1==read(EP1,retArr,RET_MAX)){
perror("rdRet");
}
}

int setCH(int freq)
{
int i;
unsigned char retArr[RET_MAX];

wrCmd(mpgOffCmd);
channelCmd[3] = (freq >> 16) & 0xFF;
channelCmd[4] = (freq >> 8) & 0xFF;
channelCmd[5] = freq & 0xFF;
wrCmd(channelCmd);
usleep(500000);
for(i=0;i<10;i++){
wrCmd(chkRecCmd);
rdRet(retArr);
if(retArr[0]){
wrCmd(mpgOnCmd);
return 1;
}
usleep(100000);
}
return 0;
}

int getTS(unsigned char *pdata)
{
int i;

if(TS_PACKET_SIZE > read(EP3, pdata, TS_PACKET_SIZE))
return 0;
for (i = 1; i < TS_PACKET_SIZE; i++)
pdata[i] ^= 0xb5;
return 1;
}

int main(int argc, char *argv[])
{

char devName[PATH_MAX],EPname[PATH_MAX];
unsigned char TsPkt[TS_PACKET_SIZE];
int opt;
int freq= 545143;
int i=1;

while((opt=getopt(argc, argv,"f:c:o"))!=-1){
switch(opt){
case 'o':break;
case 'c':
ugenNum=optarg;
break;
case 'f':
freq=atoi(optarg);
break;
default:break;
}
}
sprintf(devName,"/dev/ugen%s",ugenNum);
if(-1==(EP0=open(devName, O_RDWR))){
perror("open EP0");
exit(-1);
}

if(!chkVnd()){
fprintf(stderr,"this is not dus01\n");
exit(-1);
}

sprintf(EPname,"%s.1",devName);
if(-1==(EP1=open(EPname,O_RDWR))){
perror("open EP1");
exit(-1);
}

sprintf(EPname,"%s.3",devName);
if(-1==(EP3=open(EPname,O_RDONLY))){
perror("open EP3");
exit(-1);
}

ioctl(EP1,USB_SET_SHORT_XFER,&i);
if(!setCH(freq)){
fprintf(stderr,"No Signal\n");
exit(-1);
}

while(getTS(TsPkt))
write(STDOUT_FILENO,TsPkt,TS_PACKET_SIZE);
wrCmd(mpgOffCmd);
return 1;
}