如何在 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 将是卡在你的新文件中间,如果你播放它可能听起来很奇怪!
因此,当您连接文件时,您需要执行以下操作:
- 删除每个文件的前 44 个字节
- 连接两个字节
数组
- 根据RIFF header specification
新建header
- 把这个 header 放在
串联字节数组的前面
- 致电
WaveFileReader wavFileReader = new
WaveFileReader(outputSound);
我针对我的问题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 将是卡在你的新文件中间,如果你播放它可能听起来很奇怪!
因此,当您连接文件时,您需要执行以下操作:
- 删除每个文件的前 44 个字节
- 连接两个字节 数组
- 根据RIFF header specification 新建header
- 把这个 header 放在 串联字节数组的前面
- 致电
WaveFileReader wavFileReader = new WaveFileReader(outputSound);