ZigZag Sin
登 陆
上一篇:mdhd Box 下一篇:minf Box

hdlr Box

Time
2022-2-21 11:39 阅读 1212

具体 Box 分析

Hdlr Box

官方介绍定义

image-20211220163319042

传送门:MP4 文档 P20页

介绍

这个 Box 也是 Full Box,意味着 Box Header 有 Version 和 Flag 字段,该 Box 解释了媒体的播放过程信息,用来设置不同 Track 的处理方式,标识了该 Track 的类型。

字段分析:

名称大小(byte)意义说明
Box length4Box 整体的大小包含 Header 和 Data部分
Box type4”mdhd”的ASCII码,表明是 mdhd boxbox 属性值,通常是固定值
version1box版本一般为0
flags3该 Box 该字段填充0
handle type4Handle 的类型不太重要,默认为0即可
hand sub type4Track 类型视频:“vide” 音频:“soun”
reserved3保留字段默认为0
name可变,根据box length算出Track 的名字打包时填写的字符串

工具分析:

16 进制工具分析查看

image-20211220164542317

具体值(Video Track):

名称实际值(16进制)具体值(10进制 / ASCII)字段位置
Box length00 00 00 2D45Header
Box type68 64 6C 72"hdlr"Header
version00 Header
flags00 00 00 Header
handle type00 00 00 00 Data
hand sub type76 69 64 65videData
reserved00 ... Data
name56 ... 72VideoHandlerData

上面解析完后打开 MP4 Infor 进行分析对比

video track 下的 hdlr

image-20211220165048154

audio track 下的 hdlr

image-20211220165106138

符合我们上面的解析

代码定义

// BaseBox.h  

// ...
// 其他 Box 的定义


class TimeHdlrBox : public BaseBox {
public:
    Timebyte version = 0;
    Timebyte flags = 0;
    unsigned int handle_type = 0;
    char hand_sub_type[5] = {0}; // Track 类型
    unsigned char reserved[3] = {0};
    char name[1024] = {0}; // Track 的名字
    TimeHdlrBox(BoxHeader h);
    TimeHdlrBox(BoxHeader h, Timebyte * d): BaseBox(h, d){};
    void PrintDataInfo() override;
};

实现

TimeHdlrBox::TimeHdlrBox(BoxHeader h) : BaseBox(h) {
    if (h.GetDataSize()) {
        data = new Timebyte[h.GetDataSize()];
    }
}

void TimeHdlrBox::PrintDataInfo() {
    printf("===========================\n");
    h.to_string();
    TimeBufferStream bufferStream(data, h.GetDataSize());
    version = bufferStream.GetUChar();
    bufferStream.GetLenData(&flags, 3);
    handle_type = bufferStream.GetUInt();
    bufferStream.GetLenData(hand_sub_type, 4);
    bufferStream.GetLenData(reserved, 12);
    bufferStream.GetLenData(name, 1024);


    printf("version:%ud \n", version);
    printf("flags:%ud \n", flags);
    printf("handle_type:%ud \n", handle_type);
    printf("hand_sub_type: %s\n", hand_sub_type);
    printf("name:%s \n", name);
}


最后运行解析

Video Track

image-20211220172127262

Audio Track

image-20211220172206415

上一篇:mdhd Box 下一篇:minf Box
给我买个键盘吧。。。求打赏。。。
欢迎加群,一起交流~~~