Stream rawAudioStream = Producer.GetRawAudiofileStream(...);
我知道那些流数据格式:
// WaveFormat(int rate,int bits,int channels);WaveFormat waveformat = new WaveFormat(8000,16,1);
我想要的是以编程方式为这些内存流添加正确的头信息,而无需将它们写入物理文件.
我怎样才能做到这一点?
PS:我检查了NAudio库,但只找到了一种通过将流写入真实物理文件来创建标头的方法,这种方式不适合我的情况.
var waveformat = new WaveFormat(8000,1);var reader = new RawSourceWaveStream(rawAudioMemStream,waveformat);using (var convertedStream = WaveFormatConversionStream.CreatePCMStream(reader)) { WavefileWriter.CreateWavefile(filename,convertedStream); }rawAudioMemStream.Close();解决方法 下面的代码将Wav标头写入MemoryStream的开头.这意味着您首先需要将标题写入流中,然后您可以编写样本.否则,您的流开头的样本将被元数据覆盖,
// totalSampleCount needs to be the combined count of samples of all channels. So if the left and right channels contain 1000 samples each,then totalSampleCount should be 2000.// isfloatingPoint should only be true if the audio data is in 32-bit floating-point format.private voID WriteWavheader(MemoryStream stream,bool isfloatingPoint,ushort channelCount,ushort bitDepth,int sampleRate,int totalSampleCount){ stream.position = 0; // RIFF header. // Chunk ID. stream.Write(EnCoding.ASCII.GetBytes("RIFF"),4); // Chunk size. stream.Write(BitConverter.GetBytes(((bitDepth / 8) * totalSampleCount) + 36),4); // Format. stream.Write(EnCoding.ASCII.GetBytes("WAVE"),4); // Sub-chunk 1. // Sub-chunk 1 ID. stream.Write(EnCoding.ASCII.GetBytes("fmt "),4); // Sub-chunk 1 size. stream.Write(BitConverter.GetBytes(16),4); // Audio format (floating point (3) or PCM (1)). Any other format indicates compression. stream.Write(BitConverter.GetBytes((ushort)(isfloatingPoint ? 3 : 1)),2); // Channels. stream.Write(BitConverter.GetBytes(channelCount),2); // Sample rate. stream.Write(BitConverter.GetBytes(sampleRate),4); // Bytes rate. stream.Write(BitConverter.GetBytes(sampleRate * channelCount * (bitDepth / 8)),4); // Block align. stream.Write(BitConverter.GetBytes((ushort)channelCount * (bitDepth / 8)),2); // Bits per sample. stream.Write(BitConverter.GetBytes(bitDepth),2); // Sub-chunk 2. // Sub-chunk 2 ID. stream.Write(EnCoding.ASCII.GetBytes("data"),4); // Sub-chunk 2 size. stream.Write(BitConverter.GetBytes((bitDepth / 8) * totalSampleCount),4);}总结
以上是内存溢出为你收集整理的c# – 为内存中的流创建有效的wav文件头全部内容,希望文章能够帮你解决c# – 为内存中的流创建有效的wav文件头所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)