use crate::atoms::*; pub enum TrackFlag { TrackEnabled = 0x000001, // TrackInMovie = 0x000002, // TrackInPreview = 0x000004, } #[derive(Debug, Clone, PartialEq)] pub struct TkhdBox { pub version: u8, pub flags: u32, pub creation_time: u64, pub modification_time: u64, pub track_id: u32, pub duration: u64, pub layer: u16, pub alternate_group: u16, pub volume: FixedPointU8, pub matrix: Matrix, pub width: FixedPointU16, pub height: FixedPointU16, } #[derive(Debug, Clone, PartialEq, Default)] pub struct Matrix { pub a: i32, pub b: i32, pub u: i32, pub c: i32, pub d: i32, pub v: i32, pub x: i32, pub y: i32, pub w: i32, } impl TkhdBox { pub fn get_type(&self) -> BoxType { BoxType::TkhdBox } pub fn get_size(&self) -> u64 { let mut size = HEADER_SIZE + HEADER_EXT_SIZE; if self.version == 1 { size += 32; } else if self.version == 0 { size += 20; } size += 60; size } pub fn set_width(&mut self, width: u16) { self.width = FixedPointU16::new(width); } pub fn set_height(&mut self, height: u16) { self.height = FixedPointU16::new(height); } }
单个 track 的 metadata,包含如下字段:
- version:tkhd box的版本;
- flags:按位或操作获得,默认值是7(0x000001 | 0x000002 | 0x000004),表示这个track是启用的、用于播放的 且 用于预览的。
- Track_enabled:值为0x000001,表示这个track是启用的,当值为0x000000,表示这个track没有启用;
- Track_in_movie:值为0x000002,表示当前track在播放时会用到;
- Track_in_preview:值为0x000004,表示当前track用于预览模式;
- creation_time:当前track的创建时间;
- modification_time:当前track的最近修改时间;
- track_ID:当前track的唯一标识,不能为0,不能重复;
- duration:当前track的完整时长(需要除以timescale得到具体秒数);
- layer:视频轨道的叠加顺序,数字越小越靠近观看者,比如1比2靠上,0比1靠上;
- alternate_group:当前track的分组ID,alternate_group值相同的track在同一个分组里面。同个分组里的track,同一时间只能有一个track处于播放状态。当alternate_group为0时,表示当前track没有跟其他track处于同个分组。一个分组里面,也可以只有一个track;
- volume:audio track的音量,介于0.0~1.0之间;
- matrix:视频的变换矩阵;
- width、height:视频的宽高;