ZigZag Sin
登 陆
上一篇:stsd Box 下一篇:avcC Box

avcC mp4a Box

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

具体 Box 分析

Avc1 Box / Mp4a Box

官方介绍定义

image-20211223200138187

传送门:MP4 文档 P28页

介绍

编码类型是 H264 数据的这个 Box 则为 Avc1 Box,Box 内部含有音视频信息。

字段分析 Avc1 Box:

这里由于官方定义的一些保留字段和预定义字段有些没太大意义,下面我会根据一些字段进行合并到一起,如果有疑问可以看官方文档的介绍。

名称大小(byte)意义说明
Box length4Box 整体的大小包含 Header 和 Data部分
Box type4”stsd”的ASCII码,表明是 stsdboxbox 属性值,通常是固定值
reserve6 默认值0
data_reference_ID2引用参考 Dref Box
code_stream_version2 默认值0
reserver14 默认值0
width2图像宽度
height2图像高度
horizontal_resolution4水平分辨率默认值 0x00480000
vertical_resolution4垂直分辨率默认值 0x00480000
reserver4
frame_count2每采样点图像的帧数,一般为1,有些情况下,每个采样点有多帧默认值一般是0x00 01
compressorname32编码名称
depth2深度,图像是彩色的,没有alpha默认 0x0018
reserver2

工具分析

image-20211223210841310

下面来分析具体值

名称实际值(16进制)具体值(10进制 / ASCII)字段默认值
Box length00 00 00 85133Header 和 Data部分长度
Box type61 76 63 31“avc1”box 属性值,通常是固定值
reserve00 ...0默认值0
data_reference_ID00 011
code_stream_version00 000默认值0
reserver00 ...0默认值0
width07 801920
height04 381080
horizontal_resolution00 48 00 000x00480000默认值 0x00480000
vertical_resolution00 48 00 000x00480000默认值 0x00480000
reserver00 ...
frame_count00 011默认值一般是0x00 01
compressorname0A 41 56 43 ..."AVC Coding"
depth00 1824默认 0x0018
reserverFF FF

接下来我们继续分析一下 Audio Track 下的 Mp4a Box。

字段分析 Mp4a Box:

名称大小(byte)意义说明
Box length4Box 整体的大小包含 Header 和 Data部分
Box type4”stsd”的ASCII码,表明是 stsdboxbox 属性值,通常是固定值
reserve6 默认值0
data_reference_ID2引用参考 Dref Box
reserver8 默认值 0
channelcount2声道数默认值 2
samplesize2样本数默认值 16
reserved4 默认值 0
samplerate4采样率(高位)

工具分析

image-20211223212339832

名称实际值(16进制)具体值(10进制 / ASCII)字段默认值
Box length00 00 00 5484包含 Header 和 Data部分
Box type6D 70 34 61"mp4a"box 属性值,通常是固定值
reserve00 ...0默认值0
data_reference_ID00 011
reserver00 ..0默认值 0
channelcount00 022默认值 2
samplesize00 1016默认值 16
reserved00 ...0默认值 0
samplerateBB 80 00 0048000

代码定义

// BaseBox.h  

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

class TimeAvc1 : public BaseBox{
public:

    unsigned char reserver[6] = {0}; // 2 保留位默认0x00

    unsigned short data_reference_ID = 0; // 2 引用参考Dref Box

    unsigned short code_stream_version = 0; // 2 一般都是默认值0

    unsigned char reserver2 [14] = {0};

    unsigned short width = 0;
    unsigned short heigth = 0;

    unsigned int horizontal_resolution = 0; // 4 默认值一般都是72dpi(前两个字节整数部分,后面两个字节小数部分)
    
    unsigned int vertical_resolution = 0; // 4 默认值一般都是72dpi(前两个字节整数部分,后面两个字节小数部分)

    unsigned int reserver3 = 0;

    unsigned short frame_count = 0; // 默认值一般是0x00 01 每采样点图像的帧数,一般为1,有些情况下,每个采样点有多帧

    Timebyte compressorname[32] = {0}; 
    
    unsigned short depth = 0; // 两个字节默认值是0x00 0x18 即24
    
    unsigned short reserver4 = 0;


    TimeAvc1(BoxHeader h);
    TimeAvc1(BoxHeader h, Timebyte * d): BaseBox(h, d){};
    void PrintDataInfo() override;
    size_t GetDataOffset() const override {
        // Data属性大小
        return 78;
    }
    void AnalyzeBoxHeader(BoxHeader header, size_t offset) override;
};

class TimeMP4a : public BaseBox{
public:

    unsigned char reserver[6] = {0}; // 2 保留位默认0x00

    unsigned short data_reference_ID = 0; // 2 引用参考Dref Box

    unsigned char reserver2 [8] = {0};

    unsigned short channelcount = 0;
    unsigned short samplesize = 0;

    unsigned char reserver3 [4] = {0};

    unsigned int samplerate = 0;



    TimeMP4a(BoxHeader h);
    TimeMP4a(BoxHeader h, Timebyte * d): BaseBox(h, d){};
    void PrintDataInfo() override;
    size_t GetDataOffset() const override {
        // Data属性大小
        return 28;
    }
    void AnalyzeBoxHeader(BoxHeader header, size_t offset) override;
};



实现

// TimeAvc1.cpp

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

void TimeAvc1::PrintDataInfo() {

}


void TimeAvc1::AnalyzeBoxHeader(BoxHeader header, size_t offset) {
    // 如果是avc/h.264编码则构造Avcc Box
    // 如果是MPEG-4编码则构造Esds Box
    // 如果是MPEG-4编码则构造Hvcc Box

    if (header.GetType() == AVCC) {
        
    }
}

Mp4a Box

// TimeMP4a.cpp

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

void TimeMP4a::PrintDataInfo() {

}

void TimeMP4a::AnalyzeBoxHeader(BoxHeader header, size_t offset) {
    if(header.GetType() == ESDS) {
        
    }
}

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