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

本文关键字:wav 包含 标头 播放 WPF 内存 | 更新日期: 2023-09-27 17:57:11

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

有没有办法播放开头没有 wav 标头的内存流中的数据?

如果没有,有没有办法在附加流后附加 wav 标头以启动?

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

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

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

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

标头写入流,然后使用 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();