You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制MP4解析器:无需解码如何获取帧数及计算FPS?

MP4无解码获取正确帧数与FPS的解决方案

核心问题原因

你遇到的情况是MP4中的视频样本(sample)≠编码帧:部分编码格式(如H.264/H.265)会将单个编码帧拆分为多个NALU切片,每个切片在MP4中作为独立的sample存储,导致stsz的样本数远大于实际帧数。

无需解码的帧数与FPS获取方法

1. 结合stss与stts原子推导总帧数

  • stss(同步样本表)原子存储所有关键帧对应的sample索引,每个关键帧对应一个完整编码帧。
  • stts(时间-样本映射)原子记录连续相同时长的样本数量及单样本持续时间。通过计算相邻关键帧之间样本覆盖的时间跨度,结合mdhd轨道的时间尺度(timescale字段),可推导关键帧之间的非关键帧数量,累加后得到总帧数。

2. 解析stsd中的编码参数块

以H.264视频为例,解析stsd→avc1→avcC原子:

  • avcC中的序列参数集(SPS)包含标称帧率信息,可结合mdhd中的轨道总时长(duration/timescale)验证实际帧数。

3. 轨道时长结合样本时间戳计算FPS

  • 从mdhd获取轨道总时长(秒)= duration / timescale。
  • 通过stts计算所有样本的总时间跨度,结合stsc(样本-块映射)判断chunk内样本是否属于同一帧,确定实际帧数后,FPS = 实际帧数 / 总时长。

关键提醒

不要直接将stsz的样本数等同于帧数,必须根据编码格式区分sample与frame的对应关系——H.264/H.265常见多sample对应一帧,而MPEG-4通常是一个sample对应一帧。

内容的提问来源于stack exchange,提问作者Ivan Kuckir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:42:24