如何在Stream中连接2个wave文件?

时间:2015-12-15 08:22:56

标签: c# naudio

我为这个answer解决了我的问题。 我想要将带有字节数组类型的数据库的2个波形文件连接在一起并播放然后处理它!

这是我的代码:

 public static void Play()
 {
     List<byte[]> audio = dal.SelectSound("خدمات", "احیاء");

     byte[] sound = new byte[audio[0].Length + audio[1].Length];

     Stream outputSound = Concatenate(sound, audio);

     try
     {
           WaveFileReader wavFileReader = new WaveFileReader(outputSound);
           var waveOut = new WaveOut(); // or WaveOutEvent()
           waveOut.Init(wavFileReader);
           waveOut.Play();
      }
      catch (Exception ex)
      {
           Logs.ErrorLogEntry(ex);
      }
}

 public static Stream Concatenate(byte[] outputFile, List<byte[]> sourceFiles)
 {
        byte[] buffer = new byte[1024];

        Stream streamWriter = new MemoryStream(outputFile);

        try
        {
            foreach (byte[] sourceFile in sourceFiles)
            {
                Stream streamReader = new MemoryStream(sourceFile);

                using (WaveFileReader reader = new WaveFileReader(streamReader))
                {
                    int read;
                    while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        streamWriter.Write(buffer, 0, read);
                    }
                }
            }
        }

        return streamWriter;
    }

但是我收到了这个错误:

  

不是WAVE文件 - 没有RIFF标题

执行此行后:

WaveFileReader wavFileReader = new WaveFileReader(outputSound);

提前致谢。

1 个答案:

答案 0 :(得分:3)

WAV文件不仅仅是一个字节数组,每个WAV文件都有一个44字节的标题(RIFF标题)来告诉任何软件如何播放它。除此之外,这个标题包含有关文件长度的信息,因此在连接两个WAV文件时,你最终会遇到两个大问题。首先,第一个WAV文件在开始时仍然会有旧标题,这将告诉你的软件文件比实际文件短,其次,第二个WAV文件的标题将卡在新文件的中间,如果你回放它可能听起来很奇怪!

因此,当您连接文件时,您需要执行以下操作:

  1. 删除每个文件的前44个字节
  2. 连接两个字节 阵列
  3. 根据RIFF header specification
  4. 创建新标头
  5. 把这个标题放在 你的串联字节数组的前面
  6. 致电WaveFileReader wavFileReader = new WaveFileReader(outputSound);