传送门:MP4 文档 P27-29页
该 Box 存储了编码类型和初始化解码器需要的信息,与特定的 Track Type 有关,根于不同的 Track 使用不一样的编码标准。
box header 和 version 字段后会有一个 entry count 字段,根据 entry 的个数,每个 entry 会有 type 信息,如“ vide”、“sund” 等,根据 type 不同 sample description 会提供不同的信息,例如对于 video track,会有 “VisualSampleEntry” 类型信息,对于 audio track 会有 “AudioSampleEntry” 类型信息。视频的编码类型、宽高、长度,音频的声道、采样等信息都会出现在这个box中。
这个 Box 也是 Full Box,对于 Video Track 里面而言,H264 的 SPS PPS 就存在该 Box 里面,对于解码非常重要。
名称 | 大小(byte) | 意义 | 说明 |
---|---|---|---|
Box length | 4 | Box 整体的大小 | 包含 Header 和 Data部分 |
Box type | 4 | ”stsd”的ASCII码,表明是 stsdbox | box 属性值,通常是固定值 |
version | 1 | box版本 | 一般为0 |
flags | 3 | 该 Box 该字段填充0 | |
entry count | 4 | sample description 数目 |
这里我们看到 stsd box 下面还有对应的子 Box,下面子 Box 里面存放的就是对当前 Track 编解码的信息。
下面用 16 进制软件查看
Video Track
Audio Track
名称 | 实际值(16进制) | 具体值(10进制 / ASCII) | 字段位置 |
---|---|---|---|
Box length | 00 00 00 95 | 149 | Header |
Box type | 73 74 73 64 | "stsd" | Header |
version | 00 | Header | |
flags | 00 00 00 | Header | |
entry count | 00 00 00 01 | 1 | Data |
这里我们看到 entry count 的值为1,说明后面有一个关于这个 Track 的编解码信息 Box,也正如上面的软件分析出来的一样,对应 Video Track 编码类型是 H264 数据则有一个 Avc1 box,Audio Track 下面有一个 Mp4a box。
// BaseBox.h
// ...
// 其他 Box 的定义
class TimeStsdBox : public BaseBox {
public:
Timebyte version = 0;
Timebyte flags = 0;
unsigned int sample_description_entry_count = 0;
TimeStsdBox(BoxHeader h);
TimeStsdBox(BoxHeader h, Timebyte * d): BaseBox(h, d){};
size_t GetDataOffset() const override {return 8;};
void AnalyzeBoxHeader(BoxHeader header, size_t offset) override;
};
实现
// TimeStsdBox.cpp
TimeStsdBox::TimeStsdBox(BoxHeader h) : BaseBox(h) {
if (h.GetDataSize()) {
data = new Timebyte[h.GetDataSize()];
}
}
void TimeStsdBox::AnalyzeBoxHeader(BoxHeader header, size_t offset) {
if (header.GetType() == AVC1) {
}
/*===============音频===============*/
if (header.GetType() == MP4A) {
}
}