2

我想改变波形文件的比特率。

所以我在网上搜索,我发现wave文件包含一个44字节长度的header,25、26、27和28字节用于存储wave文件的比特率

所以我将波形存储在一个字节数组中,然后更改用于存储波形比特率的字节值。

这是代码:

        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);

这里我存储了pathOfWav.Text一个文本框的 Wave 文件位置,然后我存储了 Wave 文件的所有字节,ByteArr然后将 4 字节(从 25 到 28)转换为 Int32 并将其乘以 2 以提高语音速度并存储sampleRate 之后我ByteArr用新的 Bit Rate 值修改了以前的值,sampleRate然后我实例化了一个新的 MemoryStream 。

我的问题是,如何使用 Naudio 播放新的 Wave 流???

4

2 回答 2

1

要更改 WAV 文件的比特率,您不能只更新其格式块。实际上,您必须以新的采样率/比特深度(假设它是 PCM)重新编码它,或者如果它不是 PCM,则为您的编解码器选择不同的比特率。我在这里写了一篇关于在各种音频格式之间进行转换的文章,包括在不同风格的 PCM 之间进行转换。如果您的意思是更改采样率而不是比特率,同一篇文章还将解释该怎么做。

于 2013-05-21T14:42:00.140 回答
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();
于 2013-05-21T09:09:49.427 回答