ZigZag Sin
登 陆
上一篇:mdia Box 下一篇:hdlr Box

mdhd Box

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

具体 Box 分析

Mdhd Box

官方介绍定义

image-20211219204417677

传送门:MP4 文档 P19页

介绍

这个 Box 是 Full Box,意味着Box Header 有 Version 和 Flag 字段,该 Box 里面主要定义了该 Track 的媒体头信息,其中我们最关心的两个字段是 Time scale 和 Duration,分别表示了该 Track 的时间戳和时长信息,这个时间戳信息也是PTS 和 DTS 的单位。

字段分析:

名称大小(byte)意义说明
Box length4Box 整体的大小包含 Header 和 Data部分
Box type4”mdhd”的ASCII码,表明是 mdhd boxbox 属性值,通常是固定值
version1box版本一般为0
flags3该 Box 该字段填充0
creation time4当前Track创建时间1904-01-01零点开始
modification time4当前Track修改时间1904-01-01零点开始
timescale4Track的时间计算单位
duration4播放时长,需要参考前面的timescale计算
pad1(bit)
language15(bit)媒体语言码参考标准 ISO639-2/T
qualiiy2媒体的回放质量默认值00即可

工具分析:

使用16进制工具查看:

image-20211219205134635

具体值(Video Track):

名称实际值(16进制)具体值(10进制 / ASCII)字段位置
Box length00 00 00 2032Header
Box type6D 64 68 64”mdhd"Header
version00 Header
flags00 00 00 Header
creation timeDA 25 22 453659866693Data
modification timeDA 25 22 453659866693Data
timescale00 00 EA 6060000Data
duration00 1D 33 A11913761Data
pad550Data
language55 C4"und"Data
qualiiy00 Data

这里我拿 timescale 和 duration 来进行分析来计算当前 Track 的时长,1913761 / 60000 = 31.896(s)

image-20211219205936563

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

image-20211219205900520

下面关于音频 Track 的 mdhd box 也是一样的,这里也不花篇幅进行说明了,具体还是参照上面这些步骤。

代码定义

// BaseBox.h  

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

class TimeMdhdBox : public BaseBox {
public:
    Timebyte version = 0;
    Timebyte flags = 0;
    unsigned int creation_time = 0; // 4 创建时间(相对于UTC时间1904-01-01零点的秒数)

    unsigned int modification_time = 0;// 4 修改时间(相对于UTC时间1904-01-01零点的秒数)
    unsigned int time_scale = 0; // 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数,这个只用来计算了该Mp4文件的长度,但是没有参与PTS和DTS的计算。
    unsigned int duration = 0; // 该影片的播放时长,该值除以time scale字段即可以得到该影片的总时长单位秒s
    // 后面3个 不太重要
    unsigned char pad = 0;
    unsigned char* language[3] = {0};
    unsigned short qualiiy = 0;
    TimeMdhdBox(BoxHeader h);
    TimeMdhdBox(BoxHeader h, Timebyte * d): BaseBox(h, d){};
    void PrintDataInfo() override;
};

实现

// TimeMdhdBox.cpp

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

void TimeMdhdBox::PrintDataInfo() {
    printf("===========================\n");
    h.to_string();
    TimeBufferStream bufferStream(data, h.GetDataSize());
    version = bufferStream.GetUChar();
    bufferStream.GetLenData(&flags, 3);
    creation_time = bufferStream.GetUInt();
    modification_time = bufferStream.GetUInt();
    time_scale = bufferStream.GetUInt();
    duration = bufferStream.GetUInt();

    printf("version:%ud \n", version);
    printf("flags:%ud \n", flags);
    printf("creation_time:%ud \n", creation_time);
    printf("modification_time:%ud \n", modification_time);
    printf("time_scale:%ud \n", time_scale);
    printf("duration:%ud \n", duration);
    printf("Track duration:%f \n", duration / time_scale);
}
上一篇:mdia Box 下一篇:hdlr Box
给我买个键盘吧。。。求打赏。。。
欢迎加群,一起交流~~~