处理在 NAudio 中为 mp3 内存流设置 WaveFormat

Handle setting up WaveFormat for mp3 memory stream in NAudio

我正在尝试设置 WaveStream,以便它使用与传入的 mp3 数据相同的格式。我通过读取帧来获取格式,但是当我尝试使用新格式我得到一个 "AcmNotPossible calling AcmStreamOpen" 异常。

这是我尝试设置新格式的地方:

Mp3Frame f = Mp3Frame.LoadFromStream(ms);
WaveFormat targetFormat = new Mp3WaveFormat(f.SampleRate, f.ChannelMode == ChannelMode.Mono ? 1 : 2, f.FrameLength, f.BitRate);
WaveFormatConversionStream conversionStream;
try
{
    using (WaveStream blockAlignedStream =
        new BlockAlignReductionStream(conversionStream = new WaveFormatConversionStream(targetFormat,
                new Mp3FileReader(ms))))
    {
        using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
        {
            waveOut.Init(blockAlignedStream);
            waveOut.Play();

如果我设置波形流以匹配 mp3 数据格式,我不确定是否需要转换任何内容。

注意:我尝试使用 WaveFormatStream.CreatePcmStream,但对于某些 mp3,我得到的是 'static/white noise'。它们似乎是 16 位 44,100 立体声,但被标记为第 1 版第 1 层,而不是正确播放的第 1 版第 3 层。

这段代码示例似乎来自很久以前。您不需要 BlockAlignReductionStreamWaveFormatConversionStream,并且您应该远离 WaveOut 中的函数回调。这应该足以从内存流播放:

var reader = new Mp3FileReader(ms)
var waveOut = new WaveOutEvent();
waveOut.Init(reader);
waveOut.Play();