从 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));
我尝试连接不同持续时间但相同采样率的一些数据。
我用 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));