MQVで学ぶQuickTime Atomフォーマット(その2) − 各Atomタイプの解説 −
2004.02.14
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 |
|
有り |
← |
| 位置 |
サイズ |
名称 |
説明 |
例 |
| 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 |
ビデオ・オーディオデータが格納されています。上記の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へ