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

时间:2015-07-08 03:18:03

标签: c# audio mp3 naudio pcm

我试图设置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();

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

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

1 个答案:

答案 0 :(得分:0)

此代码示例似乎来自很长一段时间。你不需要\r\nBlockAlignReductionStream,你应该远离WaveFormatConversionStream中的函数回调。这应该足以从内存流中播放:

WaveOut