我想更改wave文件的比特率。
所以我在网上搜索,我发现波形文件包含一个长度为44字节的标题,而25,26,27和28字节用于存储波形文件的比特率
因此我将波形存储在一个字节数组中,然后更改用于存储波形比特率的字节值。
这是代码:
private int sampleRate;
private byte[] ByteArr;
private MemoryStream ByteMem;
ByteArr = null;
ByteMem = null;
ByteArr = File.ReadAllBytes(pathOfWav.Text);
sampleRate = BitConverter.ToInt32(ByteArr, 24) * 2;
Array.Copy(BitConverter.GetBytes(sampleRate), 0, ByteArr, 24, 4);
ByteMem = new MemoryStream(ByteArr);
这里我将Wave文件位置存储在pathOfWav.Text
上,这是一个textBox,然后我将所有波形文件的字节存储在ByteArr
中,然后将4字节(从25到28)转换为Int32和将其乘以2以提高语速并将值存储在sampleRate
中
之后,我使用比特率ByteArr
的新值修改先前的sampleRate
,然后我实例化一个新的MemoryStream。
我的问题是,如何使用Naudio ???
播放新的Wave流答案 0 :(得分:0)
你解决了这个问题吗?根据你的评论,如果你只需要更改sampleRate,那你为什么要使用NAudio?您可以使用默认的可用播放器,如MediaPlayer / SoundPlayer。如果是这样,您可以参考以下代码。我添加了一种更改采样率的方法。虽然您可以单独编写waveFormat或附加,但我只提到了采样率及其相关字段。我正在阅读整个文件,关闭然后打开相同的部分写作。
(C#中的'WaveHeader格式'的原始参考:http://www.codeproject.com/Articles/15187/Concatenating-Wave-Files-Using-C-2005)
public void changeSampleRate(string waveFile, int sampleRate)
{
if (waveFile == null)
{
return;
}
/* you can add additional input validation code here */
/* open for reading */
FileStream fs = new FileStream(waveFile, FileMode.Open, FileAccess.Read);
/* get the channel and bits per sample value -> required for calculation */
BinaryReader br = new BinaryReader(fs);
int length = (int)fs.Length - 8;
fs.Position = 22;
short channels = br.ReadInt16();
fs.Position = 34;
short BitsPerSample = br.ReadInt16();
byte[] arrfile = new byte[fs.Length];
fs.Position = 0;
fs.Read(arrfile, 0, arrfile.Length); /* read entire file */
br.Close();
fs.Close();
/* now open for writing */
fs = new FileStream(waveFile, FileMode.Open, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);
bw.BaseStream.Seek(0, SeekOrigin.Begin);
bw.Write(arrfile, 0, 24); //no change till this point
/* refer to waveFormat header */
bw.Write(sampleRate);
bw.Write((int)(sampleRate * ((BitsPerSample * channels) / 8)));
bw.Write((short)((BitsPerSample * channels) / 8));
/* you can keep the same data from here */
bw.Write(arrfile, 34, arrfile.Length - 34);
bw.Close();
fs.Close();
}
现在您可以调用上述方法并以不同的采样率播放波形文件:
changeSampleRate(yourWaveFileToPlay, requiredSampleRate);
MediaPlayer mp = new MediaPlayer();
mp.Open(new Uri(yourWaveFileToPlay, UriKind.Absolute));
mp.Play();
答案 1 :(得分:0)
要更改WAV文件的比特率,您不能只更新其格式块。您实际上必须以新的采样率/位深度(假设它是PCM)重新编码它,或者如果它不是PCM,则为您的编解码器选择不同的比特率。我写了一篇关于各种音频格式之间转换的文章here,包括在不同风格的PCM之间进行转换。同一篇文章还将解释如果您的意思是更改采样率而不是比特率,该怎么做。