忘備録

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

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

2006-02-19 03:07:43 | Weblog
KMF作成あたり、一番肝心の3G2(HE-AAC)から始める。
HE-AACにエンコードするツールとして、WINAMP,HELIX,AACENC,Xenon2Pro等が
あるが、Xenon2Proのトライアル版は有効期限があるため単独での使用に留め
WINAMP,HELIX,AACENCを使ってみる。使用するにあたって基本的には各DLLを
直接コールするのがベターだが使用方法の解らない(公開されていない)為、
WINAMPの[enc_aacplus.dll]を直接利用、HELIXのproducer.exeをfrontend、
AACENCのaacenc32.exeをfrontendとしてプログラムから呼ぶことにした。
基本的にWAV->AAC->3G2変換になるのだが、MP3->WAV変換、WAVのsamplerate、
bitrateが44100,48000でなければ変換も考慮し作成するとする。
1:WINAMP[enc_aacplus.dll]
WAV->AACのDLLだが明示的に与えたsamplerate、bitrateで変換をしてくれる
優れものである。
使用方法としては一般的にLoadLibraryし、使用するfunctionをGetProcAddress
で得て使用するだけである。
WAV(channel=1or2,sampleRate=32000,44100or48000,bitsPerSample=16)->AAC
2:HELIX[producer.exe]、AACENC[aacenc32.exe]
frontendとしての使用であるからパラメータをセットし、CreateProcessを呼ぶ
だけであるが、producerは*.m4a、aacenc32は*.aacをoutputする。
只、aacenc32での変換ではsamplerate、bitrateまで変換してくれないので事前に
変換する必要がある。
producer.exe
WAV(channel=1or2,sampleRate=32000,44100or48000,bitsPerSample=16)->m4a
aacenc32.exe
WAV(channel=1or2,sampleRate=32000,44100or48000,bitsPerSample=16)->
sampleRate=32000or48000ならば44100に変換->AAC->と一工程増える。
後はenc_aacplus、aacenc32はAACから3g2に変換、これも至って簡単で、
ct-libisomedia.dllで汎用的なMP4が作られる。
ここまで出来れば後は着うたフルとしてモデファイするだけである。

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

2006-02-18 11:33:37 | Weblog
最近忙しく(?)書く暇がなく今日に至る。
今まで着うたフル等のデータについて書き綴ってきたが、
今回からは着うたフルを作るにあたり、手動で作成は結構
手間隙がかかる、そこで色んなソフトを駆使して作ることに
なるが、中々既存のソフトに都合よく出来るものがない!
既存で使えるものは使い(HE-AACエンコウダー等)ない物は
作っていくとの考えで。
既存のソフトで作成した3G2ファイルは着うたフルとはならない。
そこでバイナリエデターで各アトムを比較し着うたフルに必要な
アトム等を探し出す作業は結構大変である。
そこで第一弾としてアトムブラウザーなるものを作ることで
着うたフルに必要なアトム等を探し出す作業が簡略か出来る。
そのソフトが表示されているものである。
必要なかたがおられれば hatikazuki_1948@mail.goo.ne.jp
に連絡頂ければ差し上げますが、適当に作ってますので動作、
不具合等についてはご容赦ください。
次回はAAC,MP3,WAV等->AAC->3G2->kmfのプログラムについて


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

2006-01-13 13:14:22 | Weblog
昨日何歳??かの誕生日あー年は取りたくない!!若いころなら寒くてもゴルフに釣り、夜は飲み会と誕生日一週間はイベントが続いたもんだが、年を取ると寒さがこたえ、どうしても暖かいとこしか行きたくなくなる(パチンコ、酒)。

前回の続き

stsz -> sample (block byte) size box
[000000] 00 00 3B 1C 73 74 73 7A 00 00 00 00 00 00 00 00
[000010] 00 00 0E C2 00 00 01 11 00 00 01 5D 00 00 01 B5
以下省略
$00-03 size 0x00003B1C(15132)
$04-07 name 0x7374737A(stsz)
$08 version 0x00(0)
$09-0B flags 0x00000080)
$0C-0F block byte size for all 0x00000000(0) different sizes = 0
$10-13 number of block sizes 0x00000EC2(3778)
$14-17 block byte sizes 0x00000111(273) 以後3777block続く
全ブロック総バイト=mdatサイズとなる。

stsc -> sample/framing to chunk/block box
[000000] 00 00 00 28 73 74 73 63 00 00 00 00 00 00 00 02
[000010] 00 00 00 01 00 00 00 15 00 00 00 01 00 00 00 B4
[000020] 00 00 00 13 00 00 00 01
$00-03 size 0x00000028(40)
$04-07 name 0x73747363(stsc)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of blocks 0x00000002(2)
$10-13 frames per block(first/next block) 0x00000001(1)
$14-17 frames per block(# of frames) 0x00000015(21)
$18-1B samples description id 0x00000001(1)
以後12バイトごと、number of blocks分続く
同一framesが続く場合、次に違うframesがくるまで省略できるので
第一フレーム0x15(21)で第二フレーム0x13(19)のfirst/next blockが0xB4(180)なので第一フレーム0x15(21)が179続いていることになる。

stco -> chunk/block offset box
[000000] 00 00 02 E0 73 74 63 6F 00 00 00 00 00 00 00 B4
[000010] 00 00 43 80 以後省略
$00-03 size 0x000002E0(736)
$04-07 name 0x7374636F(stco)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of offsets 0x000000B4(180)
$10-13 block offsets 0x00004380 以後4バイトごと、number of offsets分続く
block offsetsはmdatの絶対アドレスを指している為、mdat以前のアトムを編集した場合(増減)はblock offsetsの値を修正する必要がある。

stss -> optional sync sample (key/intra frame) box
[000000] 00 00 02 E0 73 74 73 73 00 00 00 00 00 00 00 B4
{000010] 00 00 00 01 00 00 00 16 以後省略
$00-03 size 0x000002E0(736)
$04-07 name 0x73747373(stss)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of key frames 0x000000B4(180)
$10-13 key/intra frame location 0x00000001
$14-17 key/intra frame location 0x00000016 以後省略
key/intra frame location は先ほどstscの# of framesの値を参照にし、第一キーよりの加算値となる。
本来このアトムはなくても聴くには支障がないが、着うた切り出しに必要となるもので、全ての携帯をチェックしたわけではないが付加されてない場合は切り出しが不能となる携帯もある。

今回までのアトムが実装された3G2ファイルであれば着登録(メール着)が可能である。
断片化(QTPRO)の場合はmoovアトム内に規定のアトムが実装されていない為(上記アトム外)に起こりうる問題であり規定のアトムを実装するこにより回避できる。

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

2006-01-11 15:13:42 | Weblog
前回に続き、、

stbl -> sample (framing info) table box
[000000] 00 00 41 8E 73 74 62 6C
$00-03 size 0x0000418E(16782)
$04-07 name 0x7374626C(stbl)

stts -> time to sample (frame timing) box
[000000] 00 00 00 18 73 74 74 73 00 00 00 00 00 00 00 01
[000010] 00 00 0E C2 00 00 04 00
$00-03 sise 0x00000018(24)
$04-07 name 0x73747473(stts)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of times 0x00000001(1)
$10-13 framing rate count 0x00000EC2(3778)
$14-17 duration 0x00000400(1024)

stsd -> sample (frame encoding) description box
[000000] 00 00 00 6A 73 74 73 64 00 00 00 00 00 00 00 01
[000010] 00 00 00 5A 6D 70 34 61 00 00 00 00 00 00 00 01
[000020] 00 00 00 00 00 00 00 00 00 02 00 10 00 00 00 00
[000030] 56 22 00 00 00 00 00 36 65 73 64 73 00 00 00 00
[000040] 03 80 80 80 25 00 00 00 04 80 80 80 17 40 15 00
[000050] 06 00 00 00 BB 80 00 00 BB 80 05 80 80 80 05 13
[000060] 90 56 E5 A0 06 80 80 80 01 02
$00-03 size 0x0000006A(106)
$04-07 name 0x73747364(stsd)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of descriptions 0x00000001 default = 1
$10-13 description size 0x0000005A(90)
$14-17 description name 0x6D703461(mp4a)
$18-1D reserved 0x000000000000
$1E-1F data reference index 0x0001
$20-21 QUICKTIME audio encoding version 0x00(0) default = 0
$22-23 QUICKTIME audio encoding revision level 0x00(0) default = 0
$24-27 QUICKTIME audio encoding vendor 0x00000000("")
$28-29 audio channels 0x00002(2) mono = 1 stereo = 2
$2A-2B audio sample size 0x0010(16) 8 or 16
$2C-2D QUICKTIME audio compression id 0x0000(0) default = 0
$2E-2F QUICKTIME audio packet size 0x0000(0)
$30-33 audio sample rate 0x56220000(22050.0)
$34-37 ES Descriptor size 0x00000036(54)
$38-3B ES Descriptor name 0x65736473(esds) vers. 2 ES Descriptor box
$3C version 0x00(0)
$3D-3F flags 0x000000(0)
$40 ES descriptor type tag 0x03(3)
$41-43 start or end type 0x808080 start = 0x80 end = 0xFE
$44 descriptor type length 0x25(37)
$45-46 ES ID 0x0000(0)
$47 stream priority 0x00 defaults = 16 0 - 31
$48 ES descriptor type tag 0x04(4)
$49-4B start or end type 0x808080 start = 0x80 end = 0xFE
$4C descriptor type length 0x17(23)
$4D object type ID 0x40(64) MPEG-4 video = 32 audio = 64
$4E stream type or flags 0x15 bit展開後
00010101 左から
6bit 000101 0x05(5) audio = 5 visual = 4
1bit 0 0x00(0) upstream flag
1bit 1 0x01(1) reserved flag set to 1
$4F-51 buffer size 0x000600(1536)
$52-55 maximum bit rate 0x0000BB80(48000)
$56-59 average bit rate 0x0000BB80(48000)
maximum bit rate,average bit rate はbitrate偽装に使われてる箇所
$5A ES descriptor type tag 0x05(5)
$5B-5D start or end type 0x808080 start = 0x80 end = 0xFE
$5E descriptor type length 0x05(5)
$5F-63 header start codes 0x139056E5A0 bit展開後
0001001110010000010101101110010110100000 左から
AudioObjectType = 5bit 00010 0x02(2) = LC = 2 HE = 5
SamplingRateIndex = 4bit 0111 0x07(7) = 22050
channels = 4bit 0010 0x02(2) mono = 1 stereo = 2
reserved = 3bit 000 0x00
syncExtensionType = 11bit 010 1011 0111 0x2B7 = SBR Stuff
extensionAudioObjectType = 5bit 00101 0x05(5) = HE
sbrPresentFlag = 1bit 1 0x01 TRUE = SBR
extensionSamplingRateIndex = 4bit 0x04(4) = 44100
alignBits = 3bit 000 1bit毎に意味があるが、ま、いいか
$64 ES descriptor type tag 0x06(6)
$65-67 start or end type 0x808080 start = 0x80 end = 0xFE
$68 descriptor type length 0x01(1)
$69 SL value 0x02(2)

注意しなければいけないのは、$4D object type ID、$4E stream type or flags、$52- maximum bit rate、$56- average bit rate、$5F- header start codes がくい違っていると不正なデータとしてはじかれる可能性がある。

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

2006-01-09 23:30:36 | Weblog
土曜日PET検査受けた。二回目だが、前処理がCT検査より長い!!問診後静脈に放射性ブドウ糖??を入れられ約一時間安静後、台に寝かされ約20分ゴトゴトと全身撮影される、うーん長い!!CT検査なら長くて15秒ま、寝てればいいのだけど!!
結果は五日後なんにもなければ、、なるようにしかならないのが世の中やし(笑)

前回の続き

trak -> trak(element) box
[000000] 00 00 42 7B 74 72 61 6B
$00-03 size 0x0000427B(17019)
$04-07 name 0x7472616B(trak)

tkhd -> trak header box
[000000] 00 00 00 5C 74 6B 68 64 00 00 00 07 BF E0 CB FF
[000010] BF E0 CB FF 00 00 00 01 00 00 00 00 00 01 9B 35
[000020] 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
[000030] 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[000040] 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[000050] 40 00 00 00 00 00 00 00 00 00 00 00
$00-03 size 0x0000005C(92)
$04-07 name 0x746B6864()tkhd
$08 version 0x00(0)
$09-0B flags 0x000007(7)
TrackEnabled = 1 TrackInMovie = 2 TrackInPreview = 4 TrackInPoster = 8
$0C-0F creation time 0xBFE0CBFF(Wed Jan 04 00:49:03 2006)
$10-03 modification time 0x0xBFE0CBFF(Wed Jan 04 00:49:03 2006)
$14-17 trak ID 0x00000001(1) first track = 1
$18-1B reserved 0x00000000
$1C-1F duration 0x00019B35(105269)
$20-27 reserved 0x0000000000000000
$28-29 video layer 0x0000(0) middle = 0
$2A-2B alternate 0x0000(0) none = 0
$2C-2D audio volume 0x0100 mute = 0x0001 ; 100% = 1.0 ; QUICKTIME 200% max = 2.0
$2E-2F reserved 0x0000
$30-53 matrix value A,B,U,C,D,V,Xy,W
$54-57 width 0x00000000(0)
$58-5B height 0x00000000(0)

mdia -> media (stream) box
[000000] 00 00 42 17 6D 64 69 61
$00-03 size 0x00004217(16919)
$04-07 name 0x6D646961(mdia)

mdhd -> media (stream) header box
[000000] 00 00 00 20 6D 64 68 64 00 00 00 00 BF E0 CB FF
[000010] BF E0 CB FF 00 00 56 22 00 3B 08 00 55 C4 00 00
$00-03 size 0x00000020(32)
$04-07 name 0x6D646864(mdhd)
$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 0x0xBFE0CBFF(Wed Jan 04 00:49:03 2006)
$14-17 time scale 0x00005622(22050)
$18-1B duration 0x003B0800(3868672) 再生時間 = duration / time scale
$1C-1D anguage 0x55C4 (B:0101010111000100)
左から
0 -> 0x0 -> ISO language padding = 0
101010111000100 -> 0x55C4 -> ISO 639-2 language code
$1E-1F quality 0x0000 normal = 0

hdlr -> handler reference box
[000000] 00 00 00 25 68 64 6C 72 00 00 00 00 00 00 00 00
[000010] 73 6F 75 6E 00 00 00 00 00 00 00 00 00 00 00 00
[000020] 73 6F 75 6E 00
$00-03 size 0x00000025(37)
$04-07 name 0x68646C72(hdlr)
$08 version 0x00
$09-0B flags 0x000000
$0C-0F component type 0x00000000("")
$10-13 component subtype 0x736F756E("soun")
$14-17 component manufacturer 0x00000000("")
$18-1B component flags 0x00000000(0) none = 0
$1C-1F component flags mask 0x00000000(0) none = 0
$20-23 component name 0x0x736F756E00("soun")

minf -> media (stream) information box
[000000] 00 00 41 CA 6D 69 6E 66
$00-03 size 0x000041CA(16842)
$04-07 name 0x6D696E66(minf)

smhd -> sound media (stream) info header box
[000000] 00 00 00 10 73 6D 68 64 00 00 00 00 00 00 00 00
$00-03 size 0x00000010(16)
$04-07 name 0x736D6864(smhd)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0D audio balance 0x0000(0.0) normal = 0.0
$0E-0F reserved 0x0000

dinf -> data (locator) information box
[000000] 00 00 00 24 64 69 6E 66
$00-03 size 0x00000024(36)
$04-07 name 0x64696E66(dinf)

dref -> data reference box
[000000] 00 00 00 1C 64 72 65 66 00 00 00 00 00 00 00 01
[000010] 00 00 00 0C 75 72 6C 20 00 00 00 01
$00-03 size 0x0000001C(28)
$04-07 name 0x34726566(dref)
$08 version 0x00(0)
$09-0B flags 0x000000(0)
$0C-0F number of references 0x00000001(1) minimum = 1
$10-13 size 0x0000001C(12)
$14-17 type 0x75726C20("urn ")
#18 version 0x00(0)
$19-1B flags 0x000001 external data = 0x000000 internal data = 0x000001

ま、ここらのアトムはこんなのがあるんだ位で毒にも薬もならないようなもんで、あればいいと頭の片隅に、、、、次回はstblについて、ここが難解でMPプレイヤーでは考えなくても再生できるが、携帯となると駄々をこねるところである(笑)

着うたフル奮闘記(#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 );