/** * 从 MP4 文件解析视频元数据(宽高、时长、编码) * * 算法来源:scripts/api-explorer/shipinhao-video-upload/mp4-parse-poc.mjs * 已通过合成样本 8/8 + 真实 Chrome 编码视频交叉验证(见该 PoC)。 * * 只读 ISO BMFF 的 box 头做定位,元数据 box(moov / moof)才单独读进内存, * 媒体数据(mdat)直接跳过 —— 实测 78MB 视频只读 14.64KB(占全文 0.018%)。 * 因此内存占用与文件大小无关,也不受 fs.readFileSync 的 2GiB 上限约束 * (早先的实现整文件载入,2GB 以上必然抛 RangeError 并被误报成「格式不支持」)。 * 支持 MP4(ISO base media file format),不支持 AVI/MKV/FLV。 * * 时长按四级回退取值:mvhd → 视频轨 mdhd → stts 累加 → moof/trun 累加。 * 分片 MP4(fMP4,moov 里带 mvex/trex)的 mvhd/mdhd/stts 全为 0, * 真实时长只存在于各 moof 分片中,必须走最后一级才能拿到。 */ export interface VideoMeta { width: number; height: number; /** 时长(秒,浮点数) */ duration: number; /** * 旋转角度(0/90/180/270),手机竖屏视频常为 90 * * 仅用于把 tkhd 里的横屏尺寸换算成显示尺寸,不写进发布体。 * 由 buildVideoMetaFromParams 组装时恒为 0:浏览器给出的 videoWidth/videoHeight * 已经是应用过旋转的显示尺寸,再换算一次会把宽高交换错。 */ rotation: number; fileSize: number; /** * 视频轨编码格式(stsd 里的 sample entry fourcc,小写) * H.264 为 avc1/avc3,H.265 为 hvc1/hev1,解析不到时为 null */ codec: string | null; } export declare function parseVideoMeta(filePath: string): VideoMeta | null; /** 调用方传入的视频元数据(浏览器