AAC和naudio采样率不匹配

时间:2016-06-09 19:10:46

标签: c# streaming naudio

我通过在一个通过线程安全队列提供的单独线程中运行的naudio在C#中传输音频。输入到naudio是由16位PCM数据组成的流,由libfaad2和PInvoke解码的AAC,因为我没有找到本地C#AAC解码器。数据由来自直播“dab plus”广播源的连续流组成。

这一切都很顺利,有一点例外。 AAC解码器和naudio报告的数据速率不匹配。例如,libfaad2解码器报告48000 Hz采样率,已使用广播电台的元数据进行初始化。 NAudio - 使用此采样率初始化 - 在短时间后产生“缓冲区已满”异常(使用512000字节的naudio缓冲区为30秒,超时与缓冲区大小成线性比例)。

naudio的“DiscardOnBufferOverflow”选项不是问题的可行解决方案,因为它会导致 - 在该事件之后发出可听到的伪像。 当我为naudio增加报告的48000 Hz乘以3000,即用51000 Hz初始化naudio时,它在缓冲区溢出异常之前运行了将近一个小时。

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

我的问题:流式传输时,naudio和AAC解码器之间的比特率不匹配可能是什么原因?我真的很想知道这个的原因,因为我不想让当前的hack实现。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

虽然差不多有两年了,但直到今天我找到解决办法之前,行为的原因还没有解决。

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

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

NAudio不再抱怨了。