我正在尝试设置WaveStream,使其使用与传入的mp3数据相同的格式。我通过读取帧来获得该格式,但是当我尝试使用新格式实际创建新转换流时, “AcmNotPossible调用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();

我不确定是否将波形流设置为与mp​​3数据的格式匹配,是否还需要转换任何内容。

注意:我尝试使用WaveFormatStream.CreatePcmStream,但某些mp3却出现“静态/白噪声”。它们似乎是16位44,100立体声,但被标记为版本1,第1层,与版本1,第3层正确播放相反。

最佳答案

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

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

10-04 14:18