【问题标题】:using Naudio to play Stream of Wave使用 Naudio 播放 Stream of Wave
【发布时间】:2013-05-15 14:54:59
【问题描述】:

我想改变wave文件的比特率。

于是我在网上搜索,发现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);

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

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

【问题讨论】:

  • @Mark Heath 你能帮忙吗?
  • 也许如果您说明您正在尝试做什么而不是您尝试如何做,我们可以提供一个合理的答案。
  • @spender 我想改变wave文件的比特率,例如如果wave文件的比特率是44100,我想把它乘以2,然后它变成88200,我想玩在此更改后。
  • 你必须使用Naudio的WaveOut类中的方法;初始化和播放。此外,您需要更改其他相关字节(在采样率字段之后)。请在下方查看答案。
  • 这个问题的标题似乎与您的要求不符

标签: c# .net wav naudio


【解决方案1】:

你解决了这个问题吗?根据您的评论,如果您只需要更改 sampleRate,那么您为什么要使用 NAudio ?您可以使用默认可用的播放器,例如 MediaPlayer/SoundPlayer。如果是这样,您可以参考以下代码。我添加了一种更改采样率的方法。尽管您可以单独编写或附加 waveFormat,但我只提到了采样率及其相关字段。我正在阅读整个文件,关闭然后打开它以逐部分写入。

(C#中'WaveHeader Format'的原始参考: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();

【讨论】:

  • 感谢您的回答!你能解释一下你在这里做什么吗:bw.Write(sampleRate); bw.Write((int)(sampleRate * ((BitsPerSample * channels) / 8))); bw.Write((short)((BitsPerSample * channels) / 8)); /* 你可以从这里保留相同的数据 */ bw.Write(arrfile, 34, arrfile.Length - 34);
  • 当您希望设置不同的采样率时,采样率字段会更新。 Next 字段是指需要根据采样率更新的 ByteRate 和 BlockAlign。依赖字段指的是从 24 到 33 的字节偏移量。您可以在此链接中了解字段和相关公式:ccrma.stanford.edu/courses/422/projects/WaveFormat
  • 谢谢,但在某些情况下,在我更改采样比特率并想要播放文件后,会出现错误消息,说波形标头已损坏!为什么??
  • 使用内存流而不是文件时出现错误信息
  • 我用上面的方法处理了大量的语音文件,但我没有使用内存流。无论如何,在此之前,您可以通过 Windows Media Player 正常播放此文件吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多