如何在Stream中连接2个波形文件
本文关键字:2个 波形 文件 连接 Stream | 更新日期: 2023-09-27 18:26:46
我为我的问题找到了这个答案。我想把字节数组类型的数据库中得到的两个波形文件连接在一起播放然后处理掉!
这是我的代码:
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);
提前谢谢。
WAV文件不仅仅是一个字节数组,每个WAV文件都有一个44字节的头(RIFF头),用来告诉任何软件如何播放它。除其他事项外,此标头包含有关文件长度的信息,因此在以这种方式连接两个WAV文件时,最终会遇到两个大问题。首先,第一个WAV文件一开始仍然有旧的头,这会告诉你的软件文件比实际文件短,其次,第二个WAV的头会卡在你的新文件中间,如果你回放它,这可能听起来很奇怪!
因此,当您连接文件时,您需要执行以下操作:
- 删除每个文件的前44个字节
- 连接两个字节阵列
- 根据RIFF标头规范创建新标头
- 将此标头放在连接的字节数组前面
- 呼叫
WaveFileReader wavFileReader = new WaveFileReader(outputSound);