AAC和naudio采样率不匹配



我通过naudio在C#中流式传输音频,naudio运行在通过线程安全队列馈送的单独线程中。naudio的输入是一个由16位PCM数据组成的流,由libfaad2用PInvoke进行AAC解码,因为我没有找到原生的C#AAC解码器。数据由来自现场"dab-plus"广播源的连续流组成。

这一切都很顺利,只有一个小例外。AAC解码器和naudio报告的数据速率不匹配。例如,libfaad2解码器报告48000Hz的采样率,该采样率已经用广播站的元数据初始化。使用此采样率初始化的NAudio在短时间后生成"缓冲区已满"异常(30秒,具有512000字节的NAudio缓冲区,超时随缓冲区大小线性缩放)。

naudio的"DiscardOnBufferOverflow"选项并不是解决这个问题的可行方案,因为它会在事件发生后导致(当然)可听见的伪影。当我将naudio报告的48000 Hz增加3000时,即用51000 Hz初始化naudio,它在缓冲区溢出异常之前运行了将近一个小时。

我还录制了一个三分钟的文件,naudio以48kHz的频率离开,听起来很完美。

我的问题:流媒体时naudio和AAC解码器之间的比特率不匹配的原因可能是什么?我真的很想知道原因,因为我不想离开目前的黑客实施。

采样率以Hz而非bps为单位测量。你确定AAC是48kHz还是48kbps?在这种情况下,采样率可以是44.1kHz,这可以解释差异。

为了调试它,我将把libfaad2的一些输出写入一个48kHz的WAV文件,并检查它是否以预期的速度播放。

虽然快2岁了,但这种行为的原因一直没有解决,直到我今天找到了解决方案。

原因是libfaad2.dll的行为,它将AAC编码的缓冲区转换为pcm16缓冲区。通过其"NeAACDecInit"API调用(DTS头)初始化,它假设帧长度为1024字节,而DAB+数据编码为960字节。然而,libfaad对其进行了解码,导致了上述的不匹配。通常的解决方案是使用"音频特定编码(ASC)"one_answers"NeAACDecInit2"API调用,这通常应用于DAB+解码软件。使用ASC编码的"Init2"可以选择帧长度,而使用DTS头的"Init"则可以选择1024字节的帧长度。

但是,可以使用附加参数修改libfaad"NeAACDecInit"API调用,并使用该参数命令libfaad使用短帧长度。在libfaad2库中,执行此操作的正确位置可能是文件"decoder.c",位于第321行附近,并插入hDecoder->frameLength = 960;

NAudio不会再抱怨了。

最新更新