AAC 数据包大小

Ahm*_*ary 5 audio aac m4a audio-processing ffprobe

我正在处理具有以下元数据的 M4a 文件:

Metadata:
    major_brand     : M4A 
    minor_version   : 0
    compatible_brands: M4A mp42isom
    creation_time   : 2019-08-14T13:45:39.000000Z
    iTunSMPB        :  00000000 00000840 00000000 00000000000387C0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  Duration: 00:00:05.25, start: 0.047891, bitrate: 69 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 65 kb/s (default)
Run Code Online (Sandbox Code Playgroud)

音频持续时间 = 5246.2585 毫秒

我正在尝试使用以下公式计算帧数:

duration * sampling rate / frame size = 5246.2585 * 44.1/1024 = 225.9375 frames
Run Code Online (Sandbox Code Playgroud)

我尝试了多个文件,它总是给出 xxx.9357 帧。

但是,使用 FFprobe:

ffprobe -i audio.m4a  -show_streams -hide_banner
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

nb_frames=228
Run Code Online (Sandbox Code Playgroud)

我的计算和 FFprobe 输出之间始终存在 2.0625 的差异。有什么想法我在这里做错了吗?如何准确计算帧数?

Mat*_*ans 11

在AAC中,每1024个样本就有一个数据包,但每个数据包影响2048个样本,并且每个样本部分记录在两个数据包中。因此,如果要正确表示N 个数据包的音频样本,则需要使用N+1 个数据包。

如果我们认为这是每个数据包影响相应的1024 个样本以及下一个样本块,那么这意味着前 1024 个样本无法正确表示,因此常见的做法是在编码器中用零预先填充信号。在播放时,这些将被丢弃,这就是为什么信号的持续时间比您通过计算数据包所预期的时间要短的原因。

由于某种原因,通常的做法实际上是用 2112 个样本来填充,而不是仅仅使用 1024 个样本。填充的长度实际上并没有记录在 AAC 文件中,并且在标准中也没有指定,所以大家都只是使用 2112 来填充。与其他人兼容。

2112 个样本正好是 2.0625 个数据包。

如果你想了解更多这方面的知识,神奇的谷歌词是“AAC priming”