0

我使用 NAudio 读取特定 MP3 的代码得到的结果与其他几个商业应用程序不同。

具体来说:我的基于 NAudio 的代码在“可听音频”(鼓拾音器)开始之前在此 MP3 的开头找到约 1.4 秒的静音,而其他应用程序(Windows Media Player、RealPlayer、WavePad)在此之前显示约 2.5 秒的静音同样的鼓拾音器。

特定的 MP3 是从 Amazon.com 下载的“Like A Rolling Stone”。测试了其他几个 MP3,没有一个显示我的代码和其他应用程序之间有任何类似的差异。大多数 MP3 都不会以如此长时间的沉默开始,所以我怀疑这就是差异的根源。

调试问题:

  1. 我实际上无法找到一种方法来证明其他应用程序是正确的而 NAudio/me 是错误的,即将我的代码的结果逐块与“已知的良好参考实现”进行比较;因此我什至无法精确定义我需要调试的“错误”。

  2. 由于我的代码在这 1.4 秒内读取了数千个样本而没有明显错误,因此我想不出如何缩小输入流中的位置/时间以查找错误。

  3. NAudio 代码的核心是对 acmStreamConvert() 的 P/Invoke 调用,这是一个 Windows“黑盒”调用,我想不出如何进行错误检查。

谁能想到调试这个的任何技巧/技术?

4

2 回答 2

0

NAudio ACM 代码最初并非用于 MP3,而是用于解码恒定比特率电话编解码器。有一天,我尝试设置 WaveFormat 以指定 MP3 作为实验,结果听起来足够好。但是,我一直对使用 ACM 解码 MP3(尤其是 VBR)感到有点紧张(例如,如果传入 ID3 标签或专辑封面会发生什么 - 这会导致额外的沉默吗?),而且我从来没有 100%确信 NAudio 做得对 - 关于您应该如何使用 ACM 编解码器的文档很少。遗憾的是,没有可以在 NAudio 中使用的具有许可证的托管 MP3 解码器,因此 ACM 暂时仍然是唯一的选择。

我不确定其他媒体播放器采用什么方法来播放 MP3,但我怀疑他们中的许多人都有自己的内置 MP3 解码器,而不是依赖于操作系统。

于 2010-05-16T13:20:59.167 回答
0

我找到了一些我自己的问题的部分答案:

  1. 由于我的问题归结为消耗了太多 MP3 而没有产生足够的 PCM,因此我使用了条件命中计数断点来查找发生这种情况的位置,然后深入研究。

  2. 这向我表明,一些 acmStreamConvert() 调用返回成功,消耗 417 个 src 字节,但产生 0 个“使用的目标字节”。

接下来我计划尝试 acmStreamSize() 来询问编解码器它“想要”消耗多少 src 字节,而不是“告诉”它消耗 417。

编辑(跟进):我修好了!

它归结为传递 acmStreamConvert() 足够的 src 字节以使其快乐。给它 acmStreamSize() 请求的大小解决了某些地方的问题,但随后又出现在其他地方;给它请求的大小乘以 3 似乎可以解决我测试过的所有 MP3 中“使用的 0 个目标字节”的结果。

通过这个修复,acmStreamConvert() 有时会返回更大的转换块(几乎 32 KB),因此我还必须修改其他一些 NAudio 代码以传递更大的目标缓冲区来保存结果。

于 2010-05-16T15:00:43.553 回答