我应该使用哪个mp4时间刻度来创建/修改章节trak原子



背景:我正在开发一个Swift库,用于以比AVFoundation更简单、用户友好的方式修改有声读物章节和元数据。我根本不使用实际媒体进行编辑,这只是为了标记和分节有声读物文件。然而,由于我正在创建章节音轨,我需要彻底了解持续时间/时间尺度关系是如何工作的。

我以为我已经确定了,但后来我在一个由不同来源编码的文件上测试了我的库,结果发现来源对某些的处理方式非常不同,以至于我甚至无法在不破坏文件的情况下通过该文件。

考虑到我不懂C++,我已经尽我所能完全了解了MP4v2。我很清楚,我能够根据MP4v2和Apple Quicktime文档的组合对我的原子解析进行建模,但它是如何确定时间尺度的,我对此一无所知

我认为我的问题主要存在于mdhd原子,或者可能存在于tkhd原子。我知道mdhd原子中使用的时间尺度可能与mvhd原子中使用时尺度不同,而且一个轨道的mdhd原子中使用时间尺度可能不同于另一个轨道。

我迷失的是,Quicktime文档并没有那么明确地说明我们使用的是mvhd时间尺度还是mdhd时间尺度。

例如:

这是elst(编辑列表表(原子的文档,它应该是tkhd原子中使用的持续时间的来源(如果存在elst,如果不存在,则是stts原子持续时间的总和(

跟踪持续时间一个32位整数,以电影的时间刻度为单位指定此编辑片段的持续时间。

媒体时间一个32位整数,包含此编辑段的媒体中的开始时间(以媒体时间刻度单位为单位(。如果此字段设置为–1,则为空编辑。轨迹中的最后一次编辑不应为空编辑。电影的持续时间和音轨的持续时间之间的任何差异都表示为隐含的空编辑

这是否意味着使用mvhd时间尺度计算持续时间,而使用mdhd时间尺度计算媒体时间?或者文档中使用了";电影";以及";媒体";可互换,如果是,当我创建一个tkhd原子用于章节音轨时,在尝试计算持续时间时,我应该使用哪一个?

stts原子的文件上写着:

磁道中介质的长度[is](未映射到整个时间刻度,且未考虑任何编辑列表(

这似乎不对,因为没有时间刻度,持续时间只是一个没有意义的整数。我不能只假设毫秒,因为我发现了至少一个测试文件,其中必须使用44100的mdhd时间尺度来计算章节。

章节音轨mdhd原子中的时间尺度是否总是反映音轨mdhd的时间尺度?是否应该使用mdhd时间尺度来计算stts?这里有没有我完全遗漏的一些细节?

所有原子和快速时间文档都特定于包装编解码器的容器规范/协议。

最好的办法是阅读你正在使用的音频编解码器。

另一种方法是对工作媒体文件进行逆向工程,了解其工作原理,使用启发式方法制作自己的公式。

我也有同样的问题,关于这个主题的信息几乎为零,所有的文档都毫无价值,它们不会告诉你容器和编解码器是如何关联的,因为它与显示特定于容器的文档无关。

本质上,如果你想知道编解码器的持续时间与容器之间的关系,你还可以询问创建编解码器/制作媒体文件的人。10次机会中有10次,他们不会告诉你,因为他们如何使用特定的编解码器并将其打包到容器中都是专有信息。

我有一个损坏的视频,能够通过使用十六进制编辑器和启发式从零开始完全创建一个新的moov原子来100%恢复它。这其实很容易。您需要来自同一来源的两个介质文件,它们实际上可以正确播放介质,并且具有不同的介质大小。比如一个视频文件是1分钟,另一个是5分钟。然后,您可以使用解析器工具来查看原子的视频细节,并创建一些如何导出原子的公式。

然后使用该公式创建需要特定编解码器持续时间的新原子。

最新更新