MQVで学ぶQuickTime Atomフォーマット(その2)  − 各Atomタイプの解説 −

2004.02.14


○ftyp、prfl

MQV形式の独自データです。これがないと再生できません。
ftyp:0000〜0017hの18hバイト、prfl:0018h〜0037hの20hバイト。0038h以降の0C3F66hバイトがmdat。

サンプルに使用したもの。新製品プレビュー第58回 SPモード320x240 216kbps

35hバイトめがD9hになっています。ここが画質モードの設定箇所です。

画質モード 35hバイトめの下位4ビット
SP 9
LP2 7
LP1 5

※○○hという表記は、16進数であることを示します。

○mvhd (MoVie HeaDer atom)
名称 説明
Time scale サンプリング単位。1秒間をこの数値に分割したものを基準値とします。 30000
Duration 総再生時間。上記サンプリング単位を元にします。
この場合、690690/30000=23.023秒です。
690690
○tkhd (TracK HeaDer atom)
名称 説明 例(video)
Track ID   1
Duration ビデオの再生時間 690690
Track Width 横サイズ 320
Track Height 縦サイズ 240
○mdhd (MeDia HeaDer atom)
名称 説明 例(video) 例(audio)
Time scale 上記と同じ 30000 24000
Duration   690690 549888
※audioの24000は、サンプリング周波数が関係していると思われます。
○stsd-video (Sample Table Sample description atom)
位置 サイズ 名称 説明
CLIE Video Recorder
QuicktimePro
3GP
8 4 version/flags   0
0Ch 4 number of descriptions デフォルト=1 1
10h 4 length 以下のすべてのバイト数 B1h 9Bh
14h 4 descreption video format フォーマットタイプ 'mp4v'
18h 2 QUICKTIME video encoding revision   00h
1Ah 6 48-bit value すべて0 0
20h 2 QUICKTIME video encoding revision level   01h 00
22h 4 QUICKTIME video encoding vendor ベンダー名 'Sony' すべて00
26h 4 QUICKTIME video temporal quality クオリティ
1024:lossless,1023:maximum,
768:high,512:normal,256:low,
0:minimum  
03ffh 0
2Ah 4 QUICKTIME video spatial quality 0400h 0
2Eh 2 video frame pixel size width 横サイズ 0140h(320)
30h 2 video frame pixel size height 縦サイズ 0f0h(240)
32h 8 video resolution 縦横解像度、デフォルト72(48h) 0048000000480000
3Ah 4 QUICKTIME video data size 通常0 00h
3Eh 2 video frame count 通常1 01h
40h 1 video encoding name string length 名称の文字数(最大31) 16h 0
41h 31 video encoder name string エンコーダ名称 'MPEG4 Video Elementary' すべて00
5Ah 2 video pixel depth 表示色 1:mono, 2:4色, 4:4, 8:256,
16:1000s, 24:Ms, 32:Ms+A
18h
5Ch 2 QUICKTIME video color table id ない時-1(FFFFh) FFFFh
5Eh 16 pasp   有り 無し
6Eh 4bh esds   有り
○stsd-audio
位置 サイズ 名称 説明
8 4 description length   77h
0Ch 4 description audio format オーディオフォーマット 'mp4a'
10h 6 48-bit value set to zero    
16h 2 data reference index    
18h 2 QUICKTIME audio encoding version   1
1Ah 2 QUICKTIME audio encoding revision level   1
1Ch 4 QUICKTIME audio encoding vendor ベンダー名 'Sony'
20h 2 audio channels チャンネル数 mono:1, stereo:2 2
22h 2 audio sample size   10h
24h 2 QUICKTIME audio compression id default:0, VBR:-2 -2
26h 2 QUICKTIME audio packet size   0
28h 4 audio sample rate サンプリングレート 24000
○stts (Sample Table Time-To-Sample atom)
名称 説明 例(video) 例(audio)
number of entries 総フレーム数 159h(345) 219h(537)
time-to-sample table 1フレームの再生時間。Time scale / フレームレートの値 2002
(30000/14.98fps)
1024
(24000/23.44fps)

※audioの場合、フレームという言葉は適切ではありません。どちらも一律にサンプルと言った方が適切ですが、ビデオの場合、フレームがピッタリです。

○stsc (Sample Table Sample-to-Chunk atom)

  chunkの設定。chunkとは複数のサンプル(フレーム)をまとめたブロックのこと。

位置 サイズ 名称 説明
0Ch 4 Number of entries
総テーブル数
以下のchunk番号・フレーム数・IDの12バイトが1テーブルとなり、テーブル数だけ繰り返されます
10h 4 chunk番号 chunk番号
14h 4 フレーム数 chunk内に収めるフレーム数を設定。次のテーブルで指定されるchunk番号まで有効。
18h 4 samples description id 通常 1
1Ch ... chunk番号...  

1つのchunkに複数のフレームが集まっています。chunkに収まるフレーム数が変化する度に、そのchunk番号と新しく決められたフレーム数を定義します。ずっと変わらない場合、1テーブルで終わりますが、最後のchunkにフレームの端数が出る場合には、やはり定義し直しますので、たいてい2テーブルは必要です。
以下のデータでは、ほぼChunk毎にフレーム数が変化しているため、定義し直しています。3番めのchunkは定義されていないため、直前の設定である15フレームを格納します。
videoのstscはこうなっています。

chunk番号 フレーム数 description id
1 16 1
2 15 1
4 16 1
5 15 1
...    
22 15 1
23 7 1

一方、audioのstscはこうです。22chunkまですべて24個のサンプルで、最後の7サンプルは単なる端数でしょう。audioの場合、MPEG4のような圧縮とは違い、一定のサイズです。

chunk番号 サンプル数 description id
1 24 1
23 7 1
○stsz (Sample Table Sample Size atom)

  すべてのフレームのサイズを定義します。

位置 サイズ 名称 説明
10h 4 number of entries 総フレーム数
14h 4 Sample size table 1フレーム目のサイズ
18h ...   2フレーム目のサイズ...

初めの数十フレームのサイズをみると...赤字は、後で述べるキーフレームなのでさすがに大きいです。

036A 0051 004E 004D 0045 23D6 15C4 0409 03B9 03F6
040D 035C 02E8 0317 03AF 067F 07B7 0742 062A 05C1
1C2C 0345 03DD 0426 044D 060A 059C 04C3 04EB ...
○stco (Sample Table Chunk Offset atom)

  mdatブロック内に、video/audioデータがchunk単位でまとまって格納されています。このテーブルには、各chunkに対応するmdatのアドレスがすべて格納されています。

mdatブロック先頭からの相対アドレスではなく、ファイルの先頭からの絶対アドレスであることに注意。3GPファイルからMQV形式へ変換するため、大きさの違うヘッダ(ftypとprfl)に交換するなど、mdatよりファイル前方のatom構成(サイズ)を変更すると、chunkアドレスが狂ってしまうため、再生できなくなります。mdatより後方のatom構成を変更した場合、再生に影響はありません。もちろん、変更したサイズだけ、すべてのchunkアドレスを修正すれば問題なく再生できます。
QuickTime Atom形式の最大の注意点です。
位置 サイズ 名称 説明
0Ch 4 number of entries 総chunk数
10h 4 Chunk offset table chunkの絶対アドレス(Atomではなく、ファイルの先頭から)
14h ...   総ブロック数まで列挙される

初めの数chunk分のアドレスをみると...一応昇順になっていますが、途中で前のアドレス等に戻ったり繰り返したりしてデータを再利用しても良いことになっています。プレーヤーで早送りをする際には、このテーブル毎に読み込んで、最初のフレーム(サンプル)を再生しながら読み飛ばしているのかもしれません。
videoのstcoはこうなっています。

001C43 009D2E 012337 01ACFC 024273 02C943 0352FF 03E110 04AE61 054313

一方、audioのstcoはこうです。videoのアドレスと交互になっているのがわかります。コンバーターによっては、交互に記録しないでVideoデータを一括して記録してから、audioを記録するものもあります。

000040 007DC6 0103CF 018D94 02230B 02A9DB 033397 03C1A8 048EF9 0523AB
○stss (Sample Table Sync Sample atom)

  キーフレーム番号テーブル。Videoトラックのみ。

位置 サイズ 名称 説明
0Ch 4 Number of entries 総キーフレーム数
10h 4 Sync sample table 1番目のフレーム番号
14h ...   2番目のフレーム番号 
先頭の10個のキーフレームは...必ずしも等フレーム間隔で入っているわけではないことがわかります。
001 006 021 036 051 096 111 112 127 142
○mdat (Movie DATa atom)

  ビデオ・オーディオデータが格納されています。上記のstblの各設定に基づき配置されています。

Chunk番号
(ファイル先頭からのアドレス)
Video(フレーム番号)/Audio(サンプル番号)
  かっこ内はサンプルサイズ
サンプル数 サイズ合計 再生時間
Audio
Chunk01
(000040)
a001
(014F)
a002
(014F)
a003
(014F)
a004
(014F)
a005
(014F)
a006
(014F)
a007
(014F)
a008
(014F)
24 1F68
(8040)
24x1024/24000
=1.024sec
a009
(014F)
a010
(014F)
a011
(014F)
a012
(014F)
a013
(014F)
a014
(014F)
a015
(014F)
a016
(014F)
a017
(014F)
a018
(014F)
a019
(014F)
a020
(014F)
a021
(014F)
a022
(014F)
a023
(014F)
a024
(014F)
Video
Chunk01
(0014C3)
v001
(036A)
v002
(0051)
v003
(004E)
v004
(004D)
v005
(0045)
v006
(23D6)
v007
(15C4)
v008
(0409)
16 7C83
(31875)
16x2002/30000
=1.068sec
v009
(03B9)
v010
(03F6)
v011
(040D)
v012
(035C)
v013
(02E8)
v014
(0317)
V015
(03Af)
V16
(067f)
Audio
Chunk02
(007DC6)
a025
(014F)
a026
(014F)
a027
(014F)
a028
(014F)
a029
(014F)
a030
(014F)
a031
(014F)
a032
(014F)
24 1F68 24x1024/24000
=1.024sec
a033
(014F)
a034
(014F)
a035
(014F)
a036
(014F)
a037
(014F)
a038
(014F)
a039
(014F)
a040
(014F)
a041
(014F)
a042
(014F)
a043
(014F)
a044
(014F)
a045
(014F)
a046
(014F)
a047
(014F)
a048
(014F)
Video
Chunk02
(009D2E)
v17
(07B7)
v018
(0742)
v019
(062A
v020
(05C1)
v021
(1C2C)
v022
(0345)
v023
(03DD)
v024
(0426)
15 66A1
(26273)
15x2002/30000
=1.001sec
v025
(044D)
v026
(060A)
v027
(059C)
v028
(04C3)
v029
(04EB)
v030
(0558)
v031
(0550)
 
Audio
Chunk03
(0103CF)
a049
(014F)
a050
(014F)
a051
(014F)
a052
(014F)
a053
(014F)
... a071
(014F)
a072
(014F)
24 1F68 24x1024/24000
=1.024sec
Video
Chunk03
(012337)
v032
(07E8)
v033
v034
v035
v036
... v045
v046
15   15x2002/30000
=1.001sec

・mdatのデータの中にデータが収まる順番ですが、stcoで設定された各chunkのアドレスに、stscで設定されたフレーム数のデータが配置されていきます。
・stszで設定されたフレーム数のすべてのサイズを合計し、chunkアドレスに加算すると、次のchunkのアドレスになり、次のVideoかAudioのstcoで同じアドレスが設定されているはず。
・必ずしも、上記mdatのようにAudio->Video->Audioと配置されるわけではありません。ImageConverter では、先にvideoをすべて一括して配置し、後にAudioを配置しています。どう配置されているかはVideo/Audioの各stcoを見れば分かるわけです。
・赤字はstssで設定されたキーフレームを指します。
・1フレーム単位の再生時間はsttsで設定されます。再生時間をみるとわかるように、1chunkが約1秒になるようにchunk内のフレーム数が設定されていることが分かります。
・1chunkの合計サイズ×8bitで、ビットレートに近い値になります。(今回、1chunkがたまたま約1秒になっているからにすぎませんが..)

○練習問題

・フレームレートを求めよ

フレームレート  = 総フレーム数 / 総再生時間
= (stts->number of entries) / (mvhd->duration/mvhd->TimeScale)
※すべてvideo trakの値
あるいは、
フレームレート  = 1フレームの再生時間 / サンプリング単位
= (stts->time-to-sample table) / mvhd->TimeScale
※すべてvideo trakの値

・実際のビットレートを求めよ

ビットレート  = 総データ数(byte) × 8bit / 総再生時間(秒)
= stszの総合計 × 8bit / (mvhd->duration/mvhd->TimeScale)
 ※SPCamoでは、この計算式を使用しています。

トップへ     その1へ    その3へ