忘備録

年をとると忘れやすくなる。過去、これからのことを書き綴る。

着うたフル奮闘記(#6)

2006-01-05 12:42:30 | Weblog
今病院帰り、先月28日のCTの結果を聞きに何かようわからんが、肝臓に2mm位の影があるとか!担当医は転移の可能性もとか?(二年前に直腸癌切除)ま、しばらく様子を見ましょうと、又、腫瘍マーか(CEA)の値が異常に高いから次の検査までには必ずタバコを止めるようにとのお達し(泣)
CT検査だけでは心もとないので、PET検査を受けてみようと思っている。去年のPET検査では異常は見られなかったが念のためにと、

フルを作るにあたって必要と思われるATOMについて簡単に記すと

ftyp -> ファイル識別
[000000] 00 00 00 1C 66 74 79 70 6B 64 64 69 00 00 00 00
[000010] 6B 64 64 69 33 67 32 61 6D 70 34 32
$00-03 -> size 0x0000001C(28)
$04-07 -> name 0x66747970(ftyp)
$08-0B -> major brand 0x6B646469(kddi)
$0C-0F -> major brand version 0x00000000(0)
$10-13 -> compatible brands 0x6B646469(kddi)
$14-17 -> compatible brands 0x33673261(3g2a)
$18-1B -> compatible brands 0x6D703432(mp42)

uuid.cpgd -> 端末においての楽曲の制限
[000000] 00 00 00 2C 75 75 69 64 60 70 67 64 A8 8C 11 D4
[000010] 81 97 00 90 27 08 77 03 00 00 00 00 00 00 00 00
[000020] 00 00 00 00 00 00 00 00 00 00 00 00
$00-03 -> size 0x0000002C(44)
$04-07 -> name 0x75756964(uuid)
$08-0B -> sub name 0x60706764(cpgd)
$0C-17 -> なんかようわからん固定(12byte)
$18-1B -> 再生回数、有効期限制限フラグ 1bit=再生回数 2bit=有効期限(days) 3bit= 有効期限(date)
$1C-1F -> 配信制限 0x00000000 = なし 0x00000001 = あり
$20-23 -> 有効期限(date) 0xBFCDCCF0(Tue Dec 20 15:00:00 2005)
$24-27 -> 有効期限(days) 0x0000001E(30)
$28-2B -> 再生回数 0x00000003(3)
注:有効期限(date)は1904年から数値(APPLE基準)
clock = media->dwValue - 0x7C25B080; // 1970/01/01
newtime = gmtime( &clock );
if( newtime != NULL )
{
 now = asctime( newtime );
 now[strlen( now ) - 1] = 0x00;
 cszComment.Format( media->cszComment, now );
}

uuid.ioed -> 端末においての楽曲の切り出し
切り出し位置設定なし(自由設定のみ)
[000000] 00 00 00 29 75 75 69 64 69 6F 65 64 A8 8C 11 D4
[000010] 81 97 00 90 27 08 77 03 00 00 00 00 00 00 00 00
[000020] 00 00 00 00 00 00 00 00 00
$00-03 -> size 0x00000029(41)
$04-07 -> name 75756964(uuid)
$08-0B -> sub name 696F6564(ioed)
$0C-17 -> なんかようわからん固定(12byte)
$18-28 -> All 0x00 -> これで自由設定

切り出し位置設定あり
[000000] 00 00 00 C2 75 75 69 64 69 6F 65 64 A8 8C 11 D4
[000010] 81 97 00 90 27 08 77 03 00 00 00 00 00 00 00 00
[000020] 00 00 00 00 00 00 00 00 03 41 41 41 41 41 00 00
[000030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[000040] 00 00 00 00 00 00 00 00 00 00 00 01 0A 01 05 01
[000050] 00 00 02 95 00 00 00 01 00 00 00 41 42 42 42 42
[000060] 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[000070] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A
[000080] 01 19 01 00 00 02 95 00 00 00 01 00 00 00 41 43
[000090] 43 43 43 43 00 00 00 00 00 00 00 00 00 00 00 00
[0000A0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[0000B0] 00 01 0A 01 2D 01 00 00 02 95 00 00 00 01 00 00
[0000C0] 00 41
$00-03 -> size 0x000000C2(194)
$04-07 -> name 75756964(uuid)
$08-0B -> sub name 696F6564(ioed)
$0C-17 -> なんかようわからん固定(12byte)
以下多分そうであろう??
$18-1B -> 切り出し制限(A) 0x00000000 = なし 0x00000001 = あり
$1C-1F -> 切り出し制限(B) 0x00000000 = なし 0x00000001 = あり
$20-23 -> 切り出し制限(C) 0x00000000 = なし 0x00000001 = あり
$24-27 -> 自由設定制限 0x00000000 = なし 0x00000001 = あり
$28 -> 切り出し数(3)
$29-48 -> タイトル(A)
$49-4C -> 開始秒が含まれている moov,moof の絶対位置
$4D -> 0x01 固定
$4E -> 開始秒 stco,trun 位置 moov -> stco moof -> trun を参照
$4F -> 開始ミリ秒 stsc,ttrun 位置
$50-53 -> 秒数
$54-57 -> 0x00000001
$58-5B -> 0x00000041
以後同じ
自由設定が出来れば好きな所を切り出せるので個人では単純なioedで充分だろう。

moov -> ファイル メディア ヘッダー
[000000] 00 00 43 07 6D 6F 6F 76
$00-03 size 0x00004307(17159)
$04-07 name 0x6D6F6F76(moov)

mvhd -> movie (presentation) header
[000000] 00 00 00 6C 6D 76 68 64 00 00 00 00 BF E0 CB FF
[000010] BF E0 CB FF 00 00 02 58 00 01 9B 35 00 01 00 00
[000020] 01 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
[000030] 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
[000040] 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00
[000050] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[000060] 00 00 00 00 00 00 00 00 00 00 00 02
$00-03 -> size 0x0000006c(108)
$04-07 -> name 0x6D766864(mvhd)
$08 -> version 0x00(0)
$09-0B -> flags 0x000000(0)
$0C-0F -> creation time 0xBFE0CBFF (Wed Jan 04 00:49:03 2006)
$10-13 -> modification time 0xBFE0CBFF (Wed Jan 04 00:49:03 2006)
$14-17 -> time scale 0x00000258(600) サンプリング単位(defualt=600)
$18-1B -> duration 0x00019B35(105269) 総再生時間 = duration / time scale
$1C-1F -> preferred rate 0x00010000(1.0) normal = 1.0
$20-21 -> preferred vulume 0x0100(1.0) mute = 0.0 normal = 1.0 QTmax = 3.0
$22-2B -> reserved
$2C-4F -> movie matrix(A,B,U,C,D,V,X,Y,W)
$50-53 -> preview time 0x00000000(0)
$54-57 -> preview duration 0x00000000(0)
$58-5B -> poster time 0x00000000(0)
$5C-5F -> selection time 0x00000000(0)
$60-63 -> selection duration 0x00000000(0)
$64-67 -> current time 0x00000000(0)
$68-6B -> next track ID 0x00000002(2) single track = 2

え、なに、そう家内との会話である(笑)PET検査の日時が決まった!土曜日早いなー正月明けで空いてるから!!病院も高額な医療機器を遊ばすほど余裕がないからなーと独り言(ぶつぶつ)

着うたフル奮闘記(#5)

2006-01-04 23:32:59 | Weblog
実際にどの様に結合されてるか?テスト用のKMFを作る。

index.txt -> 161byte
内容
KDDIMU01
config.txt,0 ,79,text/plain
music.3g2,1024 ,193740,audio/3gpp2
jacket.jpg,195584 ,2379,image/jpeg
description.txt,198656 ,99,text/plain

config.txt -> 79byte
内容
 KDDIMU01

 wallpaper.jpg,
 000.000,000.000
 000.000,000.000
 000.000,000.000

music.3g2 -> 193,740byte

jacket.jpg -> 2,379byte (160*160)

description.txt -> 99byte
内容
 title,test
 artist,
 album_title,
 track_number,0101
 time,0031
 author,
 publisher,
 copyright,

上記をTARとして結合させる

$000000
 512byte (index.txt用header)
$0001FF
$000200
 index.txt(161byte) + 0x00(351byte)
$0003FF
$000400
 512byte (config.txt用header)
$0005FF
$000600
 config.txt(79byte) + 0x00(433byte)
$0007FF
$000800
 512byte (music.3g2用header)
$0009FF
$000A00
 music.3g2(193740byte) + 0x00(308byte)
$173FFF
$174000
 512byte (jacket.jpg用header)
$1741FF
$174200
 jacket.jpg(2379byte) + 0x00(181byte)
$174BFF
$174C00
 512byte (description.txt用header)
$174DFF
$174E00
 description.txt(99byte) + 0x00(413byte)
$174FFF

のような配置になるが、現実プログラミングの知識がないとこんな事を並びたてたとしても意味はないが、ま、年をとると忘れることが多いので、自分の忘備録として、、、、
非現実的だが、DOSの世界からパソコンをいじっている方なら、バイナリエデターとコマンドプロント上でTARファイルは作れると思うが????
現実はネットで探せば色んなソフトがあるので、それを上手に組み合わせて使えば至って簡単に出来る便利な世の中です。


着うたフル奮闘記(#4)

2006-01-03 02:19:41 | Weblog
KMF(TAR)ファイルの作成は出来たが本当に着うたフルとして携帯で聞けるのか?
其の前に準備X2
1:ダウンロードするにあたってパケ代がどれ位かかるのか?
 ファイルサイズが1MBとして計算してみると、1024*1024/128*0.21=1728
 え、ヤバ!!パケ代で倒産や、
 携帯に付加している割引サービスを調べってと一台はダブル定額
 もう一台はありゃパケの割引サービスがついてないわ早速ダブル定額に変更
2:サーバの準備
 使っているプロバイダーのウエブサービスを調べると.htaccessが
 サポートされてない。
 うーん困った、たかが着うたフルごときに有料のレンタルサーバを
 使うのも考えものだし、無料もあるが、、
 確か息子が何台かサーバをレンタルしてるようなこと以前言っていたような、
 聞いてみるとラッキー全部が.htaccessサポートされてるってことで、
 その内の一台に間借りさしてもらい、これで準備OK

サーバにテスト用のデレクトリを作成し、HTML,.htaccess置いて、あとは携帯にダウンしテスト開始と、しかし大変でした(汗)

テスト用の.htaccess
 W32SA用
  AddType application/x-kddi-ezmusic .kmf
 PENCK用
  AddType audio/3gpp2 .kmf
テスト用の**.html
 W32SA用
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<body>
<object data="http://movie.ezweb.ne.jp@***.co.jp/test/sa/data/test.kmf" type="application/x-kddi-ezmusic" copyright="no" standby="Download!!">
<param name="disposition" value="devcufz" valuetype="data" />
<param name="checkout" value="1" valuetype="data" />
<param name="title" value="test" valuetype="data" />
</object>
</body>
</html>
 
 PENCK用
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html>
<body>
<object data="test.kmf" type="audio/3gpp2" copyright="no" standby="Download!!">
<param name="disposition" value="devmpzz" valuetype="data" />
<param name="checkout" value="1" valuetype="data" />
<param name="title" value="test" valuetype="data" />
</object>
</body>
</html>

注1:"checkout" paramが無いとminiSDに移動は不可
注2:作成した3g2ファイルに前処理としてAU独自の[uuidcpgd][uuidioed]アトム
   を付け加える必要がある。

QTPROで作成した3g2では
 W32SA -> 再生、着うた保存不可(着うた保存から再生のみ)
 PENCK -> 再生可、着うた保存不可
あれれ、なんか変だけど一応ダウンロードはできる、携帯によって状態が違うとなると、テストが面倒やなー、、、
Xenon2Proで作成した3g2では(Start File指定)
 W32SA -> 再生、着うた保存可
 PENCK -> 再生、着うた保存可
ありゃ、すんなりいけた(嬉)なんじゃいこれは単純に3g2ファイルの問題だけじゃないか!!
昔(そんな昔ではないが)作成したAtomCheckerで可、不可の3g2の違いを調べると
エンコードがHE-AACとAAC-LCの違いだけと判明、
そこで世の中にばらまれている各HE-AACエンコードについて検証して見る。
但しW32SAとPENCKだが、

1:QTPRO6or7 -> HE-AAC 作成不可
  原因:AAC-LCのみサポート
  注:AACすどうしは可だが断片化の場合15秒で音切れあり
2:aacenc32でHE-AAC作りmp4creator60で変換したMP4ファイルは不可
  原因:aac.cpp内で使用関数の間違い
  MP4AV_AacGetConfiguration_SBR関数を使用すべきところを
  MP4AV_AacGetConfiguration関数を使用してる為であり修正後可
3:WinAmp aacplusV2 可
  注:パラメトリックステレオの場合モノラルになる。
4:helix 48 Kbps Stereo - RA 10 with aacPlus 可
5:Xenon2Pro 可
  注:Start File指定なしの場合不正なデータとなる場合あり

まだ五本しか検証していないが個人で使用するには、これで充分X2
携帯で広沢虎造(浪曲)聞けるなんて誰が想像したであろうか、50分の浪曲を6分割でダウンし、ミュージックプレイヤー聞くなんて、、、

これで昔の楽曲等が着うた登録出来るが、W32SAは3g2(512k以内)そのものをダウンロードすれば着うた登録出来るので、着うたフルから着うた保存するより楽だし、
ま、個人レベルの問題かな
しかし、最初は出来たらいいやと思っていたのが、人間ちゅう奴は出来たら出来たでもっと楽に作られないかと欲がでてくる。そこで面倒なことはマシンにさせようとソフトを作ってみた。
WAV,AAC,3GPP,3GPP2ファイルから一発でKMFを作る。考えてみれば何が必要かの解がでれば別になーんも難しいもんでないしと、せこせことコードを暇を見つけ書くこと三週間、うーん未だ何かが足らないなーとすぐ欲がでる。ん、MP3ファイルからの変換がない!!ま、いいかと思いつつ未だにコードを書いてる暇人である(笑)。

着うたフル奮闘記(#3)

2006-01-01 10:03:38 | Weblog
ファイル形式はTARファイルである。
何種類かのファイルを結合したコンテナファイルであって、ファイル構造は次とうりであると思っている??(公表されてないので絶対ではないが)
 index.txt -> ファイルの位置情報
 config.txt -> 着うた切り出し情報他
 music.3g2 -> 曲データ(HE-AAC)
 jacket.jpg -> 表示用JPEGデータ(160 x 160)
 description.txt -> 曲名等情報
 wallpaper.jpg -> 保存可能なJPEGデータ(240 x 320)
 他に歌詞用テロップがあるが不明
 index.txt + music.3g2 だけあれば最低限の着うたフルとなる。

各ファイルの詳細
index.txt書式:
 KDDIMU01[CRLF] -> KDDI識別符号
 ファイル名, -> コンテナ(index.txt除く)のファイル名
 ファイル位置(8bayte固定), -> index.txt除く絶対位置(残りは0x20で埋める)
 ファイルサイズ, -> コンテナ(index.txt除く)のファイルサイズ
 ファイル形式[CRLF] -> コンテナのファイル形式
  テキストファイル -> text/plain
  曲ファイル -> audio/3gpp2
  JPEGファイル -> image/jpeg
例:
 KDDIMU01
 config.txt,0 ,79,text/plain
 music.3g2,1024 ,134870,audio/3gpp2
 jacket.jpg,136704 ,2379,image/jpeg
 description.txt,139776 ,100,text/plain
 注:各項目間は","で区切る

config.txt書式:
 KDDIMU01[CRLF] -> KDDI識別符号
 [CRLF] -> なぜ空けているのかわからない??
 wallpaper.jpg, -> 保存可能なJPEGデータ名
 着うた切り出しスタート位置秒. -> 3桁で揃える
 着うた切り出しスタート位置ミリ秒, -> 3桁で揃える
 着うた切り出しエンド位置秒. -> 3桁で揃える
 着うた切り出しエンド位置ミリ秒[CRLF] -> 3桁で揃える
 最大3箇所まで指定可能
 注:切り出し箇所をここで指定するが、music.3g2のuuidioedにも指定が必要
   必要アトムuuidioed、stss 断片化時mfra、mfro
例:
 KDDIMU01

 wallpaper.jpg,
 000.050,030.080
 060.010,090.000
 120.070,150.500

music.3g2 -> 楽曲ファイル

jacket.jpg
 タイトル表示、再生中の表示用画像であり、160 X 160まで使用可能
 注:マックスサイズは試していないが12Kまでは確認

description.txt書式:
 title,文字列[CRLF] -> 曲名
 artist,文字列[CRLF] -> アーチスト名
 album_title,文字列[CRLF] -> アルバム名
 track_number,トラック番号 + トラック数[CRLF] -> 上位2文字番号下位2文字数
 time,文字列[CRLF] -> 再生時間、music.3g2のATOMで計算可能
 author,文字列[CRLF] -> 著者
 publisher,文字列[CRLF] -> 出版者
 copyright,文字列[CRLF] -> 著作権者

wallpaper.jpg
 保存可能なJPEGファイル。240 X 320まで使用可能

あとは作成したKMFを鯖にアップし、携帯からダウンするだけで好みの楽曲が聞けることになる。只、手動で作成はきついので自前でアプリを組めばホイホイと、、



着うたフル奮闘記(#2)

2006-01-01 01:38:08 | Weblog
着うたフルのファイル形式が"TAR"と解り、それならと作ってみることにした。
TARとは何か??昔とったなんとかでそこらあたりの知識はすこしある。
簡単に言ってしまえば、複数のファイルを結合したコンテナファイルであるが、各ファイルには必ずヘッダーが付く、すなわち、3個のファイルがあると仮定するならば{ヘッダー+1番ファイル}+{ヘッダー+2番ファイル}+{ヘッダー+3番ファイル}となる。
ヘッダー(512バイト)の構造は
ファイル名(100byte) -> このヘッダーを付けるファイル名 残りは0x00で埋める
属性(8byte) -> 0x81B6 8進数で記述 %07o 8byte目は0x00
ユーザーID(8byte) -> 0x02 8進数で記述 %07o 8byte目は0x00
グループID(8byte) -> 0x02 8進数で記述 %07o 8byte目は0x00
ファイルサイズ(12byte) -> 格納するファイルサイズ 8進数で記述 %11o 12byte目は0x00
更新日時(12byte) -> 8進数で記述 %11o 12byte目は0x00
チェックサム(8byte) -> ヘッダー部分のみチェックサム(512byte) %11o 12byte目は0x00
注:チェックサム(8byte)は0x20で埋め計算する。
タイプ(1byte) -> 0x30
リンク先ファイル名(100byte) -> なければ0x00で埋める
マジックコード(6byte) -> "ustar " 6byte目は0x00
バージョン番号(2byte) -> 0x2000
ユーザ名(32byte) -> "root" 残りは0x00
グループ名(32byte) -> "root" 残りは0x00
メジャーデバイス番号(8byte) -> ALL 0x00
マイナーデバイス番号(8byte) -> ALL 0x00
以後0x00 + 格納するファイルとなる。
TARのアライメントが512byteとなっている為、ファイルの後に0x00を付与する必要がある。
(ファイルサイズ + 511) / 512 * 512 = コンテナファイルサイズ
コンテナファイルサイズ - ファイルサイズ = 付与数(0x00)
ヘッダー + コンテナファイルサイズ = コンテナサイズ となる。
今の世の中はネットをくぐればあらゆる情報が一瞬にして手に入れることが可能な時代であるからTARについての情報ぐらいは簡単にわかると思われる。
ほんと!!昔からみれば便利な世の中に(笑)
チェックサム計算方法
uiSum = 0;
for( i = 0; i <TBL_SIZE; i++ )dummy[i];
for( i = 0; i <sizeof(m_lpHeader->dbuf.szChksum); i++ )
{
uiSum -= m_lpHeader->dbuf.szChksum[i];
uiSum += ' ';
}
::sprintf( m_lpHeader->dbuf.szChksum, "%07o", uiSum );