一、基本對象 Box
Boxes start with a header which gives both size and type.
在最前面Box 包含 size和type,size和type都是佔4個位元組。
The header permits compact or extended size (32or 64 bits) and compact or extended types (32 bits or full Universal Unique IDentifiers, i.e. UUIDs).
允許根據需要,將size 簡化或者擴充,同樣的,對於type 也可以根據需要進行簡化或者擴充。
簡化,即使用32位的 size 和type. 擴充,即使用64位的size 和type.
The standard boxes all use compact types (32-bit) and most boxes will use the compact (32-bit) size.
標準的box 使用簡化的type,即32位的,大多數box一般也都使用簡化的 32位的 size。
Typicallyonly the Media Data Box(es) need the 64-bit size.
但是 Media Data Box 需要使用64位的size.
The size is the entire size of the box, including the size and type header, fields, and all contained boxes.
size指的是整個Box的大小,包括頭部的 size和type 的大小,以及後面的值和所有的包含的其他box .
aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type) { unsigned int(32) size; unsigned int(32) type = boxtype; if (size==1) { unsigned int(64) largesize; } else if (size==0) { // box extends to end of file }if (boxtype==‘uuid’) {unsigned int(8)[16] usertype = extended_type;}}
二、擴充項物件
擴充項物件繼承了 Box,並在此基礎上增加了 version和 flages.
aligned(8) class FullBox(unsigned int(32) boxtype, unsigned int(8) v, bit(24) f) extends Box(boxtype) {unsigned int(8) version = v;bit(24) flags = f;}
三、構建檔案對象
1、File Type Box
aligned(8) class FileTypeBox extends Box(‘ftyp’) { unsigned int(32) major_brand; unsigned int(32) minor_version; unsigned int(32) compatible_brands[]; // to end of the box}
計算一下FileTypeBox的大小:
size佔32位,4個位元組;
type佔32位,4個位元組;
major_brand佔32位,4個位元組;
minor_version佔32位,4個位元組;
compatible_brands 每個brand佔32位,4個位元組;
2、Free Space Box
aligned(8) class FreeSpaceBox extends Box('free') {
unsigned int(8) data[];}
計算一下Free Space Box的大小:
size佔32位,4個位元組;
type佔32位,4個位元組;
每個 data 佔8位,1個位元組;
3、Media Data Box
aligned(8) class MediaDataBox extends Box(‘mdat’) {
bit(8) data[];
}
計算一下Media Data Box的大小:
size佔32位,4個位元組;
type佔32位,4個位元組;
每個 data 佔8位,1個位元組;
4、Movie Box
aligned(8) class MovieBox extends Box(‘moov’){
}
計算一下Movie Box 的大小:
size佔32位,4個位元組;
type佔32位,4個位元組;
5、uuid
以上分析了通過一個mp4檔案,分析了mp4檔案格式頂級box的大小 size 、類型 type 以及相鄰box的定位。
下面說一下,uuid.根據基本對象 Box 的定義,如果
boxtype==‘uuid’
那麼在type後面要包含 16個位元組的 擴充類型。擴充類型之後才是資料。
關於頂級box內部的子box的情況還沒有做出說明,在下一篇文章會繼續。
<EOF>