从 WPF 中的内存流(不包含 wav 标头)播放
本文关键字:wav 包含 标头 播放 WPF 内存 | 更新日期: 2023-09-27 17:57:11
我尝试以不同的持续时间连接一些数据,但采样率相同。我用MemoryStream.CopyTo(memoryStream)
方法连接数据。
有没有办法播放开头没有 wav 标头的内存流中的数据?
如果没有,有没有办法在附加流后附加 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();