【问题标题】:MP4 Atom Parsing - where to configure time...?MP4 Atom Parsing - 在哪里配置时间......?
【发布时间】:2013-08-28 11:53:38
【问题描述】:

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

我正在做的是尝试从现有 MP4 中获取 moov 原子/等,然后仅获取文件中 mdat 原子的子集来创建一个新的、更小的 MP4。为此,我更改了 mvhd 原子中的 duration 以及 mdia 标头中的持续时间。这个文件中没有 tkhd 原子有编辑,所以我相信我不需要改变那里的持续时间 - 我错过了什么?

在创建新的 MP4 时,我将 mdat 块与一个宽框正确分割,并将“mdat”标题/大小保持在正确的位置 - 我确保使用新内容更新大小。

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

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

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

【问题讨论】:

  • 这些文件存储什么样的音频?原始 PCM、压缩 CBR 还是压缩 VBR?

标签: audio mp4 multimedia


【解决方案1】:

我将在这里暗中刺伤,并说您没有正确更新您的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 和一个独立的应用程序,我可以尝试帮助您。

【讨论】:

  • 嘿 - 不要忽视你的回答,只是现在很忙。我可能会在接下来的一两天内回来!
  • @RyanMcGrath 别出汗,慢慢来
  • 这提供了令人难以置信的信息和帮助,尽管我最终以不同的方式解决了这个问题(完全避免了这个问题,尽管如此令人讨厌......)。据我所知,你确实是对的。
  • 很棒的帖子@devshorts 我想知道每个块的样本数量是否有任何限制。我可以将所有原始 aac 样本放在一块吗?还是我需要将样本分成不同的块?
  • @Soham 你可以让它们都一样。根据规范“每个表条目对应于一组连续的块,每个块包含相同数量的样本。此外,这些块中的每个样本都必须使用相同的样本描述。每当每个块的样本数或样本描述发生变化,您必须创建一个新的表条目。如果所有块每个块的样本数量相同并且使用相同的样本描述,则该表只有一个条目。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多