c# – 为内存中的流创建有效的wav文件头

c# – 为内存中的流创建有效的wav文件头,第1张

概述我有raw-headerless wav音频数据作为MemoryStreams. Stream rawAudioStream = Producer.GetRawAudioFileStream(...); 我知道那些流数据格式: // WaveFormat(int rate, int bits, int channels);WaveFormat waveformat = new WaveForma 我有raw-headerless wav音频数据作为MemoryStreams.

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文件头所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存