传送门:MP4 文档 P23页
这个Box 也是一个 container box,一般用来定位媒体信息。一般会包含一个 Dref Box,Dref 下面会有若干个 Url Box 或者也叫 Urn Box,这些 Box 组成一个表,用来定位 Track 的数据。
Track 可以被分成若干个段,每一段都可以根据 Url 或者 Urn 指向的地址来获取数据,sample 描述中会用这些片段的序号将这些片段组成一个完整的 track,一般情况下当数据完全包含在文件中,Url 和 Urn Box 的字符串是空的。
这个 Box 存在的意义就是允许 MP4 文件的媒体数据分开最后还能进行恢复合并操作,但是实际上,Track 的数据都保存在文件中,所以该字段的重要性还体现不出来。
名称 | 大小(byte) | 意义 | 说明 |
---|---|---|---|
Box length | 4 | Box 整体的大小 | 包含 Header 和 Data部分 |
Box type | 4 | ”dinf”的ASCII码,表明是 dinfbox | box 属性值,通常是固定值 |
Data |
这个 Box 也就充当分隔符,这里我们直接上代码定义,重点在它的子 Box 里面。
// BaseBox.h
// 这里要在BoxType添加Dinf子Box的类型和对Box获取GetBoxType的实现
// ...
// 其他 Box 的定义
class TimeDinfBox : public BaseBox {
public:
TimeDinfBox(BoxHeader h);
TimeDinfBox(BoxHeader h, Timebyte * d): BaseBox(h, d){};
void AnalyzeBoxHeader(BoxHeader header, size_t offset) override;
};
实现
TimeDinfBox::TimeDinfBox(BoxHeader h) : BaseBox(h) {
if (h.GetDataSize()) {
data = new Timebyte[h.GetDataSize()];
}
}
void TimeDinfBox::AnalyzeBoxHeader(BoxHeader header, size_t offset) {
if (header.GetType() == DREF) {
// 后面解析添加
}
}