我将在这里暗中刺伤,并说您没有stbl
正确更新偏移量。至少我没有(乍一看)看到你的蟒蛇在任何地方这样做。
STSC
让我们从数据的位置开始。数据包以块的形式写入文件,标题告诉解码器这些块的每个“块”存在于何处。该stsc
表说明了每个块存在多少个项目。first chunk
表示新块从哪里开始。这有点令人困惑,但看看我的例子。这就是说每个块有 100 个样本,直到第 8 个块。第 8 块有 98 个样本。
STCO
也就是说,您还必须跟踪这些块的偏移量在哪里。这就是stco
桌子的工作。因此,文件中的块偏移量 1 或块偏移量 2 等在哪里。
如果您修改其中的任何数据,mdat
则必须维护这些表。您不能只是mdat
将数据切掉,然后期望解码器知道该做什么。
好像这还不够,现在您还必须维护样本时间表 ( stts
) 样本大小表 ( stsz
),如果这是视频,则还必须维护同步样本表 ( stss
)。
STTS
stts
表示样本应该以时间尺度为单位播放多长时间。如果您正在制作音频,则时间刻度可能是 44100 或 48000 (kHz)。
如果您删除了一些数据,那么现在一切都可能不同步。如果这里的所有值都具有完全相同的持续时间,但你会没事的。
STSZ
stsz
表示每个样本的大小(以字节为单位)。这对于解码器能够从一个块开始,然后按其大小遍历每个样本很重要。
同样,如果所有样本大小都完全相同,那么您就可以了。音频往往几乎相同,但视频内容差异很大(关键帧之类的)
STSS
最后但并非最不重要的一点是,我们有stss
一张表格,其中说明了哪些帧是关键帧。我只有 AAC 的经验,但每个音频帧都被认为是一个关键帧。在这种情况下,您可以拥有一个描述所有数据包的条目。
关于您最初的问题,每个玩家的时间显示并不总是以相同的方式得到尊重。最准确的方法是将标头中所有帧的持续时间相加,并将其用作总时间。其他播放器使用曲目标题中的元数据。我发现最好保持所有值相同,然后玩家就会开心。
如果您正在做所有这些并且我在脚本中错过了它,那么您可以发布一个示例 mp4 和一个独立的应用程序,我可以尝试帮助您。