tkhd box的解析
常见的MP4结构图
tkhd box的定义
// tkhd box
typedef struct {
u_char size[4];
u_char name[4];
u_char version[1];
/*
flags标志位
按位或操作结果值,预定义如下:
0x000001 track_enabled,否则该track不被播放;
0x000002 track_in_movie,表示该track在播放中被引用;
0x000004 track_in_preview,表示该track在预览时被引用。
一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,
将被理解为所有track均设置了这两项;对于hint track,该值为0
*/
u_char flags[3];
u_char creation_time[4];
u_char modification_time[4];
u_char track_id[4]; // id号,不能重复且不能为0
u_char reserved1[4];
u_char duration[4]; // track的时间长度
u_char reserved2[8];
u_char layer[2]; // 视频层,默认为0,值小的在上层
u_char group[2]; // track分组信息,默认为0表示该track未与其他track有群组关系
u_char volume[2]; // 音量
u_char reverved3[2];
u_char matrix[36]; // 视频变换矩阵
u_char width[4]; // 宽
u_char heigth[4]; // 高
} mp4_tkhd_atom;
tkhd box的解析
int
Mp4Meta::mp4_read_tkhd_atom(int64_t atom_header_size, int64_t atom_data_size)
{
int64_t atom_size;
Mp4Trak *trak;
atom_size = atom_header_size + atom_data_size;
trak = trak_vec[trak_num-1];
trak->tkhd_size = atom_size;
trak->tkhd_atom.buffer = TSIOBufferCreate();
trak->tkhd_atom.reader = TSIOBufferReaderAlloc(trak->tkhd_atom.buffer);
TSIOBufferCopy(trak->tkhd_atom.buffer, meta_reader, atom_size, 0);
mp4_meta_consume(atom_size);
// 读取tkhd box,其中offsetof可以取出结构体中某个成员相对于起始地址的偏移量
mp4_reader_set_32value(trak->tkhd_atom.reader,
offsetof(mp4_tkhd_atom, size), atom_size);
return 1;
}