目录
深入理解MP4视频文件裁剪原理[上]
深入理解MP4视频文件裁剪原理[中]
深入理解MP4视频文件裁剪原理[下]
深入理解MP4视频文件裁剪原理[下下]
3.15 stbl box*
stbl box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,stbl box本身的大小在裁剪后也需要跟着调整。
3.16 stsd box
本box用来描述媒体轨道中每个样本的编解码器和参数。STSD Box包含了一个或多个Sample Entry,每个Sample Entry描述了一个媒体样本的编解码器和参数。STSD Box的作用是提供有关媒体样本的编解码器和参数的信息,以便解码器和播放器能够正确地解码和呈现媒体数据。通过解析STSD Box中的Sample Entry,可以了解媒体样本的格式和编码类型,从而选择正确的解码器和解码参数,以实现媒体的播放和展示。譬如存放H264的sps/pps帧的信息。
对于MP4文件的裁剪操作,这里不需要关心这个帧的内容,直接拷贝即可。
3.17 stts box*
stts box里面保存了一个压缩格式的表,用来描述音视频帧的解码时间戳。如下图19。
stts box里面保存的这个表c语言表示可以描述为:
struct stts_entry_t
{
uint32_t sampe_count;
uint32_t sample_delta;
}
struct stts_entry_t entry[entry_count];
其记录的含义是连续相邻的sample_count个帧每个帧的持续时长,时长单位由mdhd box中的timescale来设定。通过这个数组结构,我们就可以计算出 每一帧的解码时间戳。譬如,stts的记录为:
[{2,1000},{3,1500},{3,1200}…]
那么展开后,帧的时间戳序列为:
[0,1000,2000,3500,5000,6500,7700,8900,10100,…]
所以当裁剪的时候,因为用户指定的目标MP4的时间戳范围,所以,需要在展开后的时间戳序列中来匹配目标时间戳范围进行截取。为了让播放的时候能够不产生花屏现象,一般要求首帧是IDR帧,所以,对于用户指定的目标时间戳范围中的起始时间戳,我们需要先找到离起始时间戳最近的关键帧,得到该关键帧的帧序号,然后再直接跳过关键帧之前的帧,进行截取处理。
关于如何找到最接近的关键帧,需要查找stss box中的关键帧记录表,请参考3.18节中的内容描述。