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

how to concatenate 2 wave files in Stream?

我针对我的问题answer 进行了处理。 我想把从数据库中得到的字节数组类型的2个wave文件拼接起来播放然后处理掉!

这是我的代码:

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

但我得到这个错误:

Not a WAVE file - no RIFF header

执行此行后:

WaveFileReader wavFileReader = new WaveFileReader(outputSound);

提前致谢。

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

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

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