NAudio select AcmMp3FrameDecompressor 的正确框架
NAudio select the proper frame for AcmMp3FrameDecompressor
我正在研究流式 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 时遇到了问题:AcmNotPossible calling acmStreamConvert.
我决定分析所有起始文件帧。我已经从前 10 个 mp3 帧中的每一个创建了波形格式的解压缩器,并尝试解压缩整个文件。这是结果。第一列是用于解压器初始化的帧数,第二列是成功解压的帧数,然后是帧的属性。
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 那样读取整个文件并计算平均比特率。或者也许可以为每个帧或帧的子集创建单独的解压缩器?我尝试这样做,但新的解压器总是 returns 第一个解压帧的空数据。
我认为这些专辑封面被误解为有效的 MP3 帧。理想情况下,应该更新 NAudio 代码以在确定它找到真实音频的开始之前以相同的采样率和通道数连续查找 10 个连续帧。
我正在研究流式 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 时遇到了问题:AcmNotPossible calling acmStreamConvert.
我决定分析所有起始文件帧。我已经从前 10 个 mp3 帧中的每一个创建了波形格式的解压缩器,并尝试解压缩整个文件。这是结果。第一列是用于解压器初始化的帧数,第二列是成功解压的帧数,然后是帧的属性。
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 那样读取整个文件并计算平均比特率。或者也许可以为每个帧或帧的子集创建单独的解压缩器?我尝试这样做,但新的解压器总是 returns 第一个解压帧的空数据。
我认为这些专辑封面被误解为有效的 MP3 帧。理想情况下,应该更新 NAudio 代码以在确定它找到真实音频的开始之前以相同的采样率和通道数连续查找 10 个连续帧。