MP4 Atom Parsing - 在哪里配置时间......?

Rya*_*ath 1 audio mp4 multimedia

我写了一个MP4解析器,它可以很好地读取MP4中的原子,并将它们拼接在一起 - 结果是一个技术上有效的MP4文件,Quicktime可以打开等等,但它不能播放任何音频,因为我相信定时/采样信息全部关闭.我应该提一下,我只对音频感兴趣.

我正在做的是尝试从现有的MP4中取出moov atoms/etc,然后只取一个文件中mdat原子的子集来创建一个新的,更小的MP4.在这方面,我已经改变了durationmvhd原子,以及在时间mdia头.tkhd这个文件中没有原子有编辑,所以我相信我不需要改变那里的持续时间 - 我错过了什么?

在创建新的MP4时,我正确地mdat使用宽盒子对块进行切片,并将'mdat'标题/大小保持在正确的位置 - 我确保使用新内容更新大小.

现在它完全有110%可能我错过了一些关于格式的重要内容,但如果可能的话,我很想得到最后一块.有人有任何意见/想法吗?

代码可以在以下链接中找到:

https://gist.github.com/ryanmcgrath/958c602cff133bd7fa0b

dev*_*rts 26

我打算在黑暗中捅一下,说你没有stbl正确更新你的补偿.至少我没有(乍一看)看到你的python在任何地方都这样做.

STSC

让我们从数据的位置开始.数据包以块的形式写入文件中,标题告诉解码器这些块的每个"块"存在于何处.该stsc表说明每个块有多少项.该first chunk说,新的块的开始.这有点令人困惑,但看看我的例子.这就是说每个chunkk有100个样本,直到第8个块.在第8个块有98个样本.

在此输入图像描述

STCO

也就是说,您还必须跟踪这些块的偏移量.这是stco桌子的工作.所以,文件中的块偏移量为1,或者块偏移量为2等.

在此输入图像描述

如果您修改了任何数据,mdat则必须维护这些表.你不能只是剔除mdat数据,并期望解码器知道该怎么做.

好像这还不够,现在你还必须维护样本时间表(stts)样本大小表(stsz),如果这是视频,则同步样本表(stss).

STTS

stts表示样本应按时间单位播放多长时间.如果你正在做音频,时间刻度可能是44100或48000(kHz).

在此输入图像描述

如果你已经删除了一些数据,现在一切都可能不同步.如果这里的所有值都具有完全相同的持续时间,尽管你没事.

STSZ

stsz说每个样本的大小以字节为单位.这对于解码器能够从一个块开始,然后按其大小遍历每个样本很重要.

在此输入图像描述

同样,如果所有样本大小完全相同,那么你就可以了.音频往往几乎相同,但视频内容变化很大(关键帧等等)

STSS

最后但并非最不重要的是,我们有stss表格说哪个框架是关键帧.我只有AAC经验,但每个音频帧都被认为是一个关键帧.在这种情况下,您可以有一个描述所有数据包的条目.

在此输入图像描述


与原始问题相关,时间显示并不总是在每个玩家中以同样的方式表现出来.最准确的方法是总结标题中所有帧的持续时间,并将其用作总时间.其他玩家使用轨道标题中的元数据.我发现最好保持所有的价值相同然后玩家很开心.

如果你正在做所有这些并且我在脚本中错过了它,那么你可以发布一个示例mp4和一个独立的应用程序,我可以尝试帮助你.

  • @Soham你可以让它们都一样.根据规范"每个表条目对应一组连续的块,每个块包含相同数量的样本.此外,这些块中的每个样本必须使用相同的样本描述.每当每个块的样本数量或样本描述更改,您必须创建一个新的表项.如果所有块的每个块具有相同数量的样本并使用相同的样本描述,则此表有一个条目." (2认同)