audio - mp4atom - 如何区分音频编解码器?是 AAC 还是 MP3?

标签 audio mp4 codec

我正在开发 mp4 容器解析器,但我正在疯狂地尝试识别流的音频编解码器。 我同时使用了 QtAtomViewer 和 AtomicParsley,但是当我找到原子时:

trak->mdia->minf->stbl->stsd

即使 mp4 文件有 mp3 流,我也总是得到“mp4a”。

我应该寻找“.mp3”fourcc 吗?

我附上两个不同的mp4结构: 带有 AAC 音频流的 mp4 容器

     Atom trak @ 716882 of size: 2960, ends @ 719842
     Atom tkhd @ 716890 of size: 92, ends @ 716982
     Atom mdia @ 716982 of size: 2860, ends @ 719842
         Atom mdhd @ 716990 of size: 32, ends @ 717022
         Atom hdlr @ 717022 of size: 33, ends @ 717055
         Atom minf @ 717055 of size: 2787, ends @ 719842
             Atom dinf @ 717063 of size: 36, ends @ 717099
                 Atom dref @ 717071 of size: 28, ends @ 717099
             Atom stbl @ 717099 of size: 2727, ends @ 719826
                 Atom stts @ 717107 of size: 24, ends @ 717131
                 Atom stsz @ 717131 of size: 1268, ends @ 718399
                 Atom stsc @ 718399 of size: 40, ends @ 718439
                 Atom stco @ 718439 of size: 32, ends @ 718471
                 Atom stss @ 718471 of size: 1264, ends @ 719735
                 Atom stsd @ 719735 of size: 91, ends @ 719826
                     Atom mp4a @ 719751 of size: 75, ends @ 719826
                         Atom esds @ 719787 of size: 39, ends @ 719826
             Atom smhd @ 719826 of size: 16, ends @ 719842

带有 mp3 音频流的 mp4 容器

Atom trak @ 1663835 of size: 4844, ends @ 1668679
     Atom tkhd @ 1663843 of size: 92, ends @ 1663935
     Atom mdia @ 1663935 of size: 4744, ends @ 1668679
         Atom mdhd @ 1663943 of size: 32, ends @ 1663975
         Atom hdlr @ 1663975 of size: 45, ends @ 1664020
         Atom minf @ 1664020 of size: 4659, ends @ 1668679
             Atom smhd @ 1664028 of size: 16, ends @ 1664044
             Atom dinf @ 1664044 of size: 36, ends @ 1664080
                 Atom dref @ 1664052 of size: 28, ends @ 1664080
             Atom stbl @ 1664080 of size: 4599, ends @ 1668679
                 Atom stsd @ 1664088 of size: 87, ends @ 1664175
                     Atom mp4a @ 1664104 of size: 71, ends @ 1664175
                         Atom esds @ 1664140 of size: 35, ends @ 1664175
                 Atom stts @ 1664175 of size: 24, ends @ 1664199
                 Atom stsc @ 1664199 of size: 28, ends @ 1664227
                 Atom stsz @ 1664227 of size: 2228, ends @ 1666455
                 Atom stco @ 1666455 of size: 2224, ends @ 1668679

谢谢 有限元

更新:

我找到了解决问题的方法: 通过观看 AtomicParsley 的代码,我发现可以得到 有关流原子 (mp4a) 的编解码器信息,读取第 11 个字节 进入 esds(基本流描述)原子。

现在我正在这样工作:

如果第 11 个字节的值是 0x40,我假设流是 AAC,否则如果我读取 0x69,我假设流是 MP3。

我不喜欢这些“经验”解决方案,所以我正在寻找更正确的解决方案 方式,但我只找到 Understanding_AAC这并不完整。

有人知道在哪里可以获得 MP4 容器的更详细规范吗?

最佳答案

在“esds”原子中,有一些与确定编解码器相关的字段。 esds 原子内容的第一个字节是 objectTypeInduction (这是解决方案中的第 11 个字节)。该字段应该指示所使用的编解码器,但有一些条目被多个编解码器使用。 MP4RA 有一个 full list of codec values 。以下是与本例相关的一些内容:

  • 0x40 - MPEG-4 音频
  • 0x6B - MPEG-1 音频(MPEG-1 第 1、2 和 3 层)
  • 0x69 - MPEG-2 向后兼容音频(MPEG-2 第 1、2 和 3 层)
  • 0x67 - MPEG-2 AAC LC

0x6B0x69 分别表示 MPEG-1 和 2 层 1、2 和 3。0x67 表示 MPEG-2 AAC LC,但通常不使用 0x040(0x660x68 也是 MPEG-2 AAC 配置文件,甚至很少出现)。 0x40 表示 MPEG-4 音频。 MPEG-4 音频通常被认为是 AAC,但 MPEG-4 音频中有一个完整的音频编解码器框架,包括 AAC、BSAC、ALS、CELP 和 MP3On4。 MP3On4 是一种 MP3 变体,带有一些新的多 channel header 信息。

我们可以通过查看 AudioSpecificConfig 来了解 MPEG-4 音频中实际的音频格式。这是解码器的全局 header ,存在于“esds”原子内容的字节 13 处。在AudioSpecificConfig的开头有一个5位AudioObjectType。可以在多媒体 wiki 上找到完整列表(在您的帖子中的“MPEG-4 音频”文章下链接:http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio 但以下是有用的值:

  • 00 - 空
  • 01 - AAC Main(MPEG-2 中已弃用的 AAC 配置文件)
  • 02 - AAC LC 或向后兼容的 HE-AAC(大多数现实世界的 AAC 属于这些情况之一)
  • 03 - AAC 可扩展采样率(很少使用)
  • 03 - AAC LTP(AAC Main 的替代品,很少使用)
  • 05 - HE-AAC 显式发出信号(非向后兼容)
  • 22 - ER BSAC(韩国广播编解码器) 23 - 低延迟 AAC
  • 29 - HE-AACv2 明确发出信号(在一份草案中,这是 MP3On4)
  • 31 - ESCAPE(再读取 6 位,添加 32)
  • 32 - MP3on4 第 1 层
  • 33 - MP3on4 第 2 层
  • 34 - MP3on4 第 3 层

如果您不担心“MP3On4”mp3 变体或其他奇怪的 MPEG-4 音频编解码器,那么只需使用 objectTypeInduction

在 MPEG 规范中,这些详细信息分布在 14496-1、-12、-14 和 -3 中。其中只有 14496-12 是免费提供的:http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

关于audio - mp4atom - 如何区分音频编解码器?是 AAC 还是 MP3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987850/

相关文章:

objective-c - 从 sqlite 数据库 Objective-C 播放音频文件

ios - 表达式结果未在for循环中使用

linux - 如何阻止 Linux 计算机上的所有其他进程 XXX 毫秒?

python - 进度条在 Python 中无法正常工作

FFmpeg/Libav 音频解码示例

android - MediaCodec API android 中的 timeoutUs

c++ - 如何混合语音音频

iphone - 哪种格式支持播放视频的音频文件?

video - 当播放器客户端开始播放短跑媒体时

opencv - 如何选择全帧(未压缩)作为 VideoWriter 的编解码器