0

我正在尝试使用 NAudio 的 BufferedWaveProvider 来实现 Mp3 流媒体,这里是 Mark Heath 的博客

我已经实现了所有的流式传输,但是我收到了一个带有消息“InvalidParameter calling waveOutOpen”的 MmException。

我看到了这个相关的问题:InvalidParameter calling waveOutOpen MmException,所以我查看了使用以下代码片段获得的 WaveFormat:

private WaveFormat CreateWaveFormat(Mp3Frame frame)
{
    var numberOfChannels = frame.ChannelMode == ChannelMode.Mono ? 1 : 2;
    return new Mp3WaveFormat(frame.SampleRate, numberOfChannels, frame.FrameLength, frame.BitRate);
}

这是我从调试器中获取的 WaveFormat:

-       sampleProvider.WaveFormat   {MpegLayer3}    NAudio.Wave.WaveFormat {NAudio.Wave.Mp3WaveFormat}
    AverageBytesPerSecond   32000   int
    BitsPerSample   0   int
    BlockAlign  1   int
    Channels    2   int
    Encoding    MpegLayer3  NAudio.Wave.WaveFormatEncoding
    ExtraSize   12  int
    SampleRate  48000   int
    averageBytesPerSecond   32000   int
    bitsPerSample   0   short
    blockAlign  1   short
    blockSize   768 ushort
    channels    2   short
    codecDelay  0   ushort
    extraSize   12  short
    flags   PaddingIso  NAudio.Wave.Mp3WaveFormatFlags
    framesPerBlock  1   ushort
    id  Mpeg    NAudio.Wave.Mp3WaveFormatId
    sampleRate  48000   int
    waveFormatTag   MpegLayer3  NAudio.Wave.WaveFormatEncoding
+       Static members  

为了测试这一切,我将一个测试 Mp3 文件加载到 FileStream 中。当我使用 Mp3FileReader 读取整个流时,我决定看看 WaveFormat 的样子,有趣的是,我得到了一个完全不同的 WaveFormat:

-       format  {16 bit PCM: 48kHz 2 channels}  NAudio.Wave.WaveFormat
    AverageBytesPerSecond   192000  int
    BitsPerSample   16  int
    BlockAlign  4   int
    Channels    2   int
    Encoding    Pcm NAudio.Wave.WaveFormatEncoding
    ExtraSize   0   int
    SampleRate  48000   int
    averageBytesPerSecond   192000  int
    bitsPerSample   16  short
    blockAlign  4   short
    channels    2   short
    extraSize   0   short
    sampleRate  48000   int
    waveFormatTag   Pcm NAudio.Wave.WaveFormatEncoding

在这两种情况下,我查看了流的前 16 个字节,它们是相同的。有什么想法我哪里出错了吗?还是不同的 WaveFormats 是一个红鲱鱼?可能是其他问题吗?

谢谢你的时间!

4

1 回答 1

1

我发现了问题。问题是我使用的是 Mp3Frame 中的 WaveFormat,而不是 Mp3 解压缩器提供的 WaveFormat。WaveOut 需要完全解压缩的音频格式。

于 2017-06-29T19:44:15.997 回答