C# 使用 NAudio 转换 wav 文件

Posted

技术标签:

【中文标题】C# 使用 NAudio 转换 wav 文件【英文标题】:C# convert wav file using NAudio 【发布时间】:2014-05-02 11:26:59 【问题描述】:

我有一个 WAV 文件,其中 2^16 个值介于 0 到 2 之间。 我想将其更改为 2^8 个值...这意味着它将包含更少的信息但占用的空间更少。

我有转换公式,但我不知道如何访问数据。

我已阅读以下文件:

 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(open.FileName));

 while (wave.Position < wave.Length)
   
    read = wave.Read(buffer,0,16348); 
   

现在我可以使用波形或缓冲区。

如何将波形修改为 2^8?我想传递每个值并对其进行转换.. 但我不知道如何访问转换的值。

如果我有一个代表 wav 文件的浮点数组,我会知道如何继续。

【问题讨论】:

2^8 和 2^16,你指的是样本的位宽吗? 它会降低文件的质量......例如在图像中,如果我有 256 种颜色,即 2^8 种可能的值。我想将它降级为黑白,即2^1 个值。那 ofcurse 只是一个说明问题的例子...... change wav file ( to 16KHz and 8bit ) with using NAudio 的可能重复项 【参考方案1】:

要访问数据,请使用阅读器的 Read 方法:

var myReader = new WaveFilereader(filename);
int bytesRead = 0;
var readChunck = new byte[1024];
do

   //Read 1024 bytes at a time, will return 0 when there are no more bytes to Read
   bytesRead = myReader.Read(readChunk, 0 , readChunk.length );

   //Process the bytes here


while(bytesRead != 0)

或者,您可以通过使用媒体基础重采样器重新采样音频来让您的生活更轻松。您可以通过执行以下操作使用媒体基础重采样器对音频进行下采样:

   //Read 2-channel Audio with sample rate 44.1Khz 
    var myReader = new WaveFileReader(filename); 

    //New Waveformat has 2-channels and sample rate 22KHz
    var myOutputFormat = new WaveFormat(22000,2); 

    //Resample
    var resampledAudio = new MediaFoundationResampler(myReader, myOutputFormat)  
                                                      ResamplerQuality = 60 );

有关音频转换的更多信息,请参阅THIS。

【讨论】:

最后一个代码 sn-p 似乎只影响采样率和通道数,但保持采样位宽(这是 OP 想要更改的)...? 我不认为 OP 想改变音频的位深度,他想做的只是将音频中的样本数从 2^16 减少到 2^8,这是通过下采样来实现的。改变位深只影响一个样本用多少位来表示,不会影响样本的个数。 查看上面的 OP 评论,他将 2^8 = 256 种颜色和 2^1 = 黑白进行类比。我认为从中可以清楚地看出他关心的是位宽/深度。 那么我认为 OP 的问题与这个问题重复:***.com/questions/6647730/…

以上是关于C# 使用 NAudio 转换 wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# NAudio 操作字节?

使用 NAudio 将 WAV 文件转换为 2 个单独的 PCM 文件

使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3

Naudio mvc 将 mp3 转换为 wav

字节到 sbytes 并返回 - C# NAudio

使用 NAudio/Lame 将 .wav 转换为 mp3 时如何设置通道和采样率?