从 WPF 中的内存流(不包含 wav headers)播放

Play from a memory stream(which doesn't contain wav headers) in WPF

我尝试连接不同持续时间但相同采样率的一些数据。 我用 MemoryStream.CopyTo(memoryStream) 方法连接数据。

有没有办法从一开始没有 wav header 的内存流中播放数据?

如果没有,是否有任何方法可以在附加流后附加 wav headers 以开始?

(我想避免在磁盘中生成文件..)

您可以将 header 写入您的流,然后使用 SoundPlayer 播放 WAV。

    //your wav streams
    MemoryStream wavNoHeader1=new MemoryStream();
    MemoryStream wavNoHeader2 = new MemoryStream();
    //result WAV stream
    MemoryStream wav=new MemoryStream();
    //create & write header
    ushort numchannels = 1;
    ushort samplelength = 1; // in bytes
    uint samplerate = 22050;
    int wavsize = (int) ((wavNoHeader1.Length + wavNoHeader2.Length)/(numchannels*samplelength));
    BinaryWriter wr = new BinaryWriter(wav);
    wr.Write(Encoding.ASCII.GetBytes("RIFF"));
    wr.Write(36 + wavsize);
    wr.Write(Encoding.ASCII.GetBytes("WAVEfmt "));
    wr.Write(16);
    wr.Write((ushort)1);
    wr.Write(numchannels);
    wr.Write(samplerate);
    wr.Write(samplerate * samplelength * numchannels);
    wr.Write(samplelength * numchannels);
    wr.Write((ushort)(8 * samplelength));
    wr.Write(Encoding.ASCII.GetBytes("data"));
    wr.Write(numsamples * samplelength);
    //append data from raw streams
    wavNoHeader1.CopyTo(wav);
    wavNoHeader2.CopyTo(wav);
    //play
    wav.Position = 0;
    SoundPlayer sp=new SoundPlayer(wav);
    sp.Play();

要使用 NAudio 执行此操作,只需使用 RawSourceWaveStream 并将包含原始连接音频的 MemoryStream 传递给其构造函数。您还需要明确指定 WaveFormat 是。

memoryStream = ... // construct your audio
memoryStream.Position = 0; // rewind to beginning
var rs = new RawSourceWaveStream(memoryStream, new WaveFormat(sampleRate, 16, 1));