2D 视频文件里有什么一个 MP4 文件不是“很多图片顺序塞在一起”。它更像一个带索引的媒体数据库轨道、样本、时间戳、编码参数、同步点和显示元数据都被组织在里面。先看文件内部结构MP4 是容器不是编码。H.264 / H.265 / AV1 负责压缩画面MP4 / MOV / MKV 负责把压缩数据、时间信息和轨道关系组织起来。1. 容器、轨道、样本三层要分清层级典型对象工程含义containerMP4 / MOV / MKV负责文件结构、索引、轨道组织trackvideo / audio / subtitle每种媒体一条或多条轨道sample / packet一帧或一段编码数据demuxer 读出来交给 decoder 的单位codec bitstreamNAL / OBU / slicedecoder 真正解析的压缩语法播放器打开文件时先读容器再选择轨道再把 sample 转成 packet最后 decoder 才开始理解 codec bitstream。2. MP4 里哪些 box 最关键不同容器细节不一样但以 MP4 为例工程上常见关键结构如下Box作用出问题的表现ftyp标识文件品牌和兼容性兼容性判断失败moov元数据总入口文件无法打开或索引缺失mdat真实媒体数据packet 数据读取失败trak单条媒体轨道找不到视频/音频轨mdhdtrack 时间尺度和 duration时长、同步异常stsdsample description / codec configdecoder 初始化失败sttsdecoding time to sampleDTS / duration 错误cttscomposition time offsetB 帧 PTS 错误stsssync sample / keyframe indexseek 后花屏或失败stszsample sizepacket 边界错误stco/co64sample 文件偏移读取错位、花屏一个文件“ffprobe 看得到信息”不代表它的 sample table 一定完全正确。seek、变速、截断文件恢复这些场景会更容易暴露封装问题。3. 编码参数到底保存在哪里解码器启动前必须拿到 codec config。不同编码的名字不同但作用相似。编码关键配置用途H.264 / AVCSPS、PPS、avcC宽高、profile、level、参考帧、熵编码模式等H.265 / HEVCVPS、SPS、PPS、hvcC多层级、CTU、profile、tier、level 等AV1sequence header、av1Cprofile、level、bit depth、operating point 等VP9codec private / container fieldsprofile、bit depth、color 等参数集可以在码流里反复出现也可以集中放在 extradata 里。移动端硬解尤其依赖初始化参数如果 extradata 缺失、格式不对可能表现为软解能播、硬解打不开。4. 时间信息不只是 PTS播放器同步靠时间信息而不是靠“读到第几个 packet”。时间字段作用常见坑time scale / time base把整数时间换成秒单位换算错误导致快慢异常DTSpacket 应该进入 decoder 的时间顺序B 帧场景必须单调PTSframe 应该显示的时间显示调度核心依据durationsample 持续时间VFR 视频必须逐帧看 durationedit list轨道起始偏移和裁剪开头黑帧、音画偏移start time媒体流起点多轨同步要统一基准固定帧率视频可以看起来很简单可变帧率、B 帧、edit list、音频 priming delay 混在一起时时间线才是真正的复杂点。5. 显示元数据决定“解出来以后怎么画”decoder 主要关心码流语法但 renderer 还需要显示相关信息。信息典型来源显示阶段用途rotation matrixcontainer metadata竖屏视频转正clean aperture / cropcontainer 或 codec去掉编码填充边界SAR / pixel aspect ratiocodec VUI / container计算 DAR避免比例变形color primariesVUI / container判断 BT.709 / BT.2020 等色域transfer characteristicsVUI / HDR metadata判断 SDR / PQ / HLGmatrix coefficientsVUI选择 YUV→RGB 矩阵mastering display metadataHDR SEI / containerHDR tone mappingcontent light levelHDR metadata峰值亮度策略很多“解码没错但看着不对”的问题其实是显示元数据没有被正确传到渲染链路。6. 解码时用什么显示时用什么信息demuxerdecoderrenderer / displaytrack index选择轨道不关心不关心sample offset / size读 packet不关心不关心codec type选择 decoder初始化 decoder可能用于能力策略codec extradata提取并传递必须使用通常不直接用DTS排 packet决定输入顺序间接影响队列PTS传递时间戳输出 frame metadata决定显示时刻color metadata传递有时使用必须使用rotation / crop传递通常不用必须使用keyframe indexseekflush / restart间接影响首帧这张表是排查播放器问题的分界线先问“这个信息在哪一层被消费”再问“它有没有正确传过去”。7. 文件异常怎么定位现象优先检查典型工具方向文件打不开moov、track、codec config容器解析、ffprobe只有声音没画面video track、decoder initcodec id、extradata、profileseek 后花屏stss、IDR、参数集keyframe index、packet 边界时长不对mdhd、duration、edit listtime scale、start time变速或卡顿DTS / PTS / durationVFR、B 帧、time base颜色异常VUI、container color tagsmatrix、range、transfer横竖屏错误rotation matrixdisplay matrix 传递链路一句话总结视频文件的价值不只是保存压缩码流而是保存“decoder 如何解、renderer 如何画、播放器如何按时间组织”的全部上下文。