上次,在项目中遇到了要求合并多个声音文件的需求,在网上搜索了一下,发现有一老外写的东西。现在发在首页。dudu要是觉得不好可以撤下阿
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace MergeWaves
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class WaveIO
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public int length;
public short channels;
public int samplerate;
public int DataLength;
public short BitsPerSample;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void WaveHeaderIN(string spath)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
FileStream fs = new FileStream(spath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
length = (int)fs.Length - 8;
fs.Position = 22;
channels = br.ReadInt16();
fs.Position = 24;
samplerate = br.ReadInt32();
fs.Position = 34;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BitsPerSample = br.ReadInt16();
DataLength = (int)fs.Length - 44;
br.Close ();
fs.Close();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
private void WaveHeaderOUT(string sPath)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
FileStream fs = new FileStream(sPath, FileMode.Create, FileAccess.Write );
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BinaryWriter bw = new BinaryWriter(fs);
fs.Position = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bw.Write(new char[4]
{ 'R', 'I', 'F', 'F' });
bw.Write(length);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bw.Write(new char[8]
{'W','A','V','E','f','m','t',' '});
bw.Write((int)16);
bw.Write((short)1);
bw.Write(channels);
bw.Write(samplerate );
bw.Write((int)(samplerate * ((BitsPerSample * channels) / 8)));
bw.Write((short )((BitsPerSample * channels) / 8));
bw.Write(BitsPerSample);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bw.Write(new char[4]
{'d','a','t','a'});
bw.Write(DataLength);
bw.Close();
fs.Close();
}
public void Merge(string[] files, string outfile)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
WaveIO wa_IN = new WaveIO();
WaveIO wa_out = new WaveIO();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
wa_out.DataLength = 0;
wa_out.length = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//Gather header data
foreach (string path in files)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
wa_IN.WaveHeaderIN(@path);
wa_out.DataLength += wa_IN.DataLength;
wa_out.length += wa_IN.length;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//Recontruct new header
wa_out.BitsPerSample = wa_IN.BitsPerSample;
wa_out.channels = wa_IN.channels;
wa_out.samplerate = wa_IN.samplerate;
wa_out.WaveHeaderOUT(@outfile);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (string path in files)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
FileStream fs = new FileStream(@path, FileMode.Open, FileAccess.Read);
byte[] arrfile = new byte[fs.Length - 44];
fs.Position = 44;
fs.Read(arrfile, 0, arrfile.Length);
fs.Close();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
FileStream fo = new FileStream(@outfile, FileMode.Append, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fo);
bw.Write(arrfile);
bw.Close();
fo.Close();
}
}
}
}
直接调用Merge方法就可以了,第一个参数是要合并的声音数组,第二个是输出的路径