// 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的解析
intMp4Meta::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;}
新闻热点
疑难解答