.net NAudio为AcmMp3FrameDecompressor选择适当的帧

.net NAudio为AcmMp3FrameDecompressor选择适当的帧,.net,streaming,mp3,naudio,.net,Streaming,Mp3,Naudio,我正在研究流式mp3播放器。最初,在创建AcmMp3FrameDecompressor时,我使用了第一个帧来确定波形格式,如演示所示。然后我意识到一些文件以错误的速度播放(通常较慢)。我查看了Mp3FileReader的实现,发现它决定了第一帧和第二帧 // workaround for a longstanding issue with some files failing to load // because they report a spurious sample rate change

我正在研究流式mp3播放器。最初,在创建AcmMp3FrameDecompressor时,我使用了第一个帧来确定波形格式,如演示所示。然后我意识到一些文件以错误的速度播放(通常较慢)。我查看了Mp3FileReader的实现,发现它决定了第一帧和第二帧

// workaround for a longstanding issue with some files failing to load
// because they report a spurious sample rate change
var secondFrame = Mp3Frame.LoadFromStream(mp3Stream);
if (secondFrame != null &&
       (secondFrame.SampleRate != firstFrame.SampleRate ||
        secondFrame.ChannelMode != firstFrame.ChannelMode))
{
              ...
    firstFrame = secondFrame;
}
我已经开始使用相同的方法,它解决了播放速度的问题。后来我发现了一堆仍然不能正确播放的文件。我扩展了逻辑来考虑第三帧。这解决了更多的问题,但当解压程序抛出NAudio.MmException:acmnotmable调用acmStreamConvert时,我最终遇到了问题

我决定分析所有的起始文件帧。我从前10个mp3帧中的每一帧创建了wave格式的解压器,并尝试解压整个文件。以下是结果。第一列是用于解压器初始化的帧数,第二列是成功解压的帧数,然后是帧的属性

0: decompressed: 6215 sample rate: 44100 Stereo      bitrate: 96000  
1: decompressed: 6215 sample rate: 44100 JointStereo bitrate: 128000
2: decompressed: 0    sample rate: 12000 DualChannel bitrate: 96000 
3: decompressed: 0    sample rate: 44100 Mono        bitrate: 224000
4: decompressed: 0    sample rate: 16000 Mono        bitrate: 24000 
5: decompressed: 6215 sample rate: 48000 DualChannel bitrate: 64000 
6: decompressed: 6215 sample rate: 44100 DualChannel bitrate: 96000 
7: decompressed: 0    sample rate: 48000 Mono        bitrate: 96000 
8: decompressed: 0    sample rate: 11025 JointStereo bitrate: 112000
9: decompressed: 6215 sample rate: 32000 JointStereo bitrate: 160000
10:decompressed: 6215 sample rate: 48000 JointStereo bitrate: 384000

有没有办法确定最好的画面?我播放流中的音频,因此无法像Mp3FileReader那样读取整个文件并计算平均比特率。或者可以为每个帧或帧子集创建单独的解压缩程序?我试过这样做,但新的解压器总是返回第一个解压帧的空数据。

我认为这些是被误解为有效MP3帧的专辑艺术。理想情况下,NAudio代码应该进行更新,以查找一行中具有相同采样率和通道数的10个连续帧,然后再确定它已找到真正音频的开始。

我在应用程序中尝试过这种方法,它适用于所有遇到问题的文件。但理想情况下NAudio会处理好的,是的。非常感谢@VitaliyGorbenko-我同意,标准做法,我也相信NAudio应该包含这一基本特征。谁知道这些天从一条小溪到另一条小溪里有什么垃圾。