using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{
public partial class Form2 : Form
{
/// <summary>
/// ERROR MESSAGE
/// </summary>
const string ERRFILENOTEXITS = "File is Not Exits.";
const string ERRFILEISNOTWAVE = "File is not Wava.";
/// <summary>
/// Wave Hander information
/// </summary>
struct HeaderType
{
public byte\[\] riff; /\*RIFF类资源文件头部 4byte\*/
public uint file\_len; /\*文件长度4byte\*/
public byte\[\] wave; /\*"WAVE"标志4byte\*/
public byte\[\] fmt; /\*"fmt"标志4byte\*/
public uint NI1; /\*过渡字节4byte\*/
public ushort format\_type; /\*格式类别(10H为PCM形式的声音数据)2byte\*/
public ushort Channels; /\*Channels 1 = 单声道; 2 = 立体声2byte\*/
public uint frequency; /\*采样频率4byte\*/
public uint trans\_speed; /\*音频数据传送速率4byte\*/
public ushort dataBlock; /\*数据块的调整数(按字节算的)2byte\*/
public ushort sample\_bits; /\*样本的数据位数(8/16) 2byte\*/
public byte\[\] data; /\*数据标记符"data" 4byte\*/
public uint wav\_len; /\*语音数据的长度 4byte\*/
}
private HeaderType wavHander; //定义一个头结构体
private byte\[\] buff = new byte\[\]; //header byte
private byte\[\] databuff; //data byte
public Form2()
{
InitializeComponent();
InitialStruct();
}
/// <summary>
/// 初始化结构体中的数组长度,分配内存
/// </summary>
private void InitialStruct()
{
wavHander.riff = new byte\[\];//RIFF
wavHander.wave = new byte\[\];//WAVE
wavHander.fmt = new byte\[\];//fmt
wavHander.data = new byte\[\];//data
}
/// <summary>
/// 读取PCM中数据,
/// </summary>
/// <param name="filepath">文件路径</param>
/// <returns>读取成功返回真</returns>
private bool readPcm(string filepath)
{
String fileName = filepath;//临时保存文件名
if (File.Exists(fileName) == false)//文件不存在
{
throw new Exception(ERRFILENOTEXITS);
}
//自读方式打开
FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
if (file == null)//打开成功
{
file.Close();//关闭文件
throw new Exception(ERRFILEISNOTWAVE);
}
int filelen = (int)file.Length;//获取文件长度
databuff = new byte\[filelen + \];//分配 内存
file.Read(databuff, , filelen);//读取文件,保存在内存中
file.Close();//关闭文件
return true;
}
/// <summary>
/// 为PCM文件构建文件头,准备转换为WAV文件
/// </summary>
/// <returns>构建成功返回真</returns>
private bool InitHeader()
{
wavHander.riff = Encoding.ASCII.GetBytes("RIFF"); /\*RIFF类资源文件头部 4byte\*/
wavHander.file\_len = (uint)(databuff.Length); /\*文件长度4byte\*/
wavHander.wave = Encoding.ASCII.GetBytes("WAVE"); /\*"WAVE"标志4byte\*/
wavHander.fmt = Encoding.ASCII.GetBytes("fmt "); /\*"fmt"标志4byte\*/
wavHander.NI1 = 0x10; /\*过渡字节4byte\*/
wavHander.format\_type = 0x01; /\*格式类别(10H为PCM形式的声音数据)2byte\*/
wavHander.Channels = 0x01; /\*Channels 1 = 单声道; 2 = 立体声2byte\*/
wavHander.frequency = 0x1F40; /\*采样频率4byte\*/
wavHander.trans\_speed = 0x3E80; /\*音频数据传送速率4byte\*/
wavHander.dataBlock = 0x02; /\*数据块的调整数(按字节算的)2byte\*/
wavHander.sample\_bits = 0x10; /\*样本的数据位数(8/16) 2byte\*/
wavHander.data = Encoding.ASCII.GetBytes("data"); /\*数据标记符"data" 4byte\*/
wavHander.wav\_len = (uint)(databuff.Length - ); /\*语音数据的长度 4byte\*/
byte\[\] byt2;//临时变量 ,保存2位的整数
byte\[\] byt4;//临时变量, 保存4位的整数
Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(wavHander.riff), , , databuff, );/\*RIFF类资源文件头部 4byte\*/
byt4 = BitConverter.GetBytes(wavHander.file\_len); /\*文件长度4byte\*/
Array.Copy(byt4, , databuff, , );
Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(wavHander.wave), , , databuff, );/\*"WAVE"标志4byte\*/
Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(wavHander.fmt), , , databuff, );/\*"fmt"标志4byte\*/
byt4 = BitConverter.GetBytes(wavHander.NI1);/\*过渡字节4byte\*/
Array.Copy(byt4, , databuff, , );
byt2 = BitConverter.GetBytes(wavHander.format\_type);/\*格式类别(10H为PCM形式的声音数据)2byte\*/
Array.Copy(byt2, , databuff, , );
byt2 = BitConverter.GetBytes(wavHander.Channels);/\*Channels 1 = 单声道; 2 = 立体声2byte\*/
Array.Copy(byt2, , databuff, , );
byt4 = BitConverter.GetBytes(wavHander.frequency);/\*采样频率4byte\*/
Array.Copy(byt4, , databuff, , );
byt4 = BitConverter.GetBytes(wavHander.trans\_speed);/\*音频数据传送速率4byte\*/
Array.Copy(byt4, , databuff, , );
byt2 = BitConverter.GetBytes(wavHander.dataBlock);/\*数据块的调整数(按字节算的)2byte\*/
Array.Copy(byt2, , databuff, , );
byt2 = BitConverter.GetBytes(wavHander.sample\_bits);/\*样本的数据位数(8/16) 2byte\*/
Array.Copy(byt2, , databuff, , );
Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(wavHander.data), , , databuff, );/\*数据标记符"data" 4byte\*/
byt4 = BitConverter.GetBytes(wavHander.wav\_len); /\*语音数据的长度 4byte\*/
Array.Copy(byt4, , databuff, , );
return true;
}
/// <summary>
/// 读取WAVE文件,包括文件头和数据部分
/// </summary>
/// <param name="filepath">文件路径</param>
/// <returns>读取成功返回真</returns>
private bool readWav(string filepath)
{
String fileName = filepath;//保存文件名
if (File.Exists(fileName) == false)//文件不存在
{
throw new Exception(ERRFILENOTEXITS);
}
//只读方式打开文件
FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
if (file == null || file.Length < ) //长度少于44,或者打开失败
{
file.Close();//
throw new Exception(ERRFILEISNOTWAVE);
}
file.Read(buff, , );//读取文件头
if (fixedData(buff) == false)//按位置保存文件头信息到结构体中
throw new Exception(ERRFILEISNOTWAVE);
databuff = new byte\[wavHander.wav\_len\];//分配内存
try
{
file.Read(databuff, , databuff.Length);//读取文件数据去数据
return true;
}
catch
{
return false;
}
finally
{
file.Close();//关闭文件
}
}
/// <summary>
/// 把文件头数组信息保存到结构体中
/// </summary>
/// <param name="pbuff">文件头数组</param>
/// <returns>保存成功返回真</returns>
bool fixedData(byte\[\] pbuff)
{
Array.Copy(pbuff, , wavHander.riff, , );//
if (Encoding.ASCII.GetString(wavHander.riff) != "RIFF")//确定文件是WAVA类型
return false;
wavHander.file\_len = BitConverter.ToUInt32(pbuff, );
Array.Copy(pbuff, , wavHander.wave, , );
Array.Copy(pbuff, , wavHander.fmt, , );
wavHander.NI1 = BitConverter.ToUInt32(pbuff, );
wavHander.format\_type = BitConverter.ToUInt16(pbuff, );
wavHander.Channels = BitConverter.ToUInt16(pbuff, );
wavHander.frequency = BitConverter.ToUInt32(pbuff, );
wavHander.trans\_speed = BitConverter.ToUInt32(pbuff, );
wavHander.dataBlock = BitConverter.ToUInt16(pbuff, );
wavHander.sample\_bits = BitConverter.ToUInt16(pbuff, );
Array.Copy(pbuff, , wavHander.data, , );
wavHander.wav\_len = BitConverter.ToUInt32(pbuff, );
return true;
}
/// <summary>
/// 获取待转换的文件名 /button1 && button3
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1\_Click(object sender, EventArgs e)
{
txtWav2Pcm\_pcm.Text = getOpenFileName("WAV");
}
/// <summary>
/// 打开对话框,获取被打开的文件路径
/// </summary>
/// <param name="type">WAV && PCM</param>
/// <returns>文件名</returns>
private string getOpenFileName(string type)
{
openFileDialog1.InitialDirectory = "c://";//初始路径
openFileDialog1.Title = "";//初始文件名为空
if (type == "WAV")//WAV文件被打开
openFileDialog1.Filter = "all file|\*.\*|wav|\*.wav";
else
openFileDialog1.Filter = "all file|\*.\*|pcm|\*.pcm";
openFileDialog1.FilterIndex = ;
if (openFileDialog1.ShowDialog() == DialogResult.OK) return openFileDialog1.FileName;
else return "";
}
private string getSaveFileName(string type)
{
saveFileDialog1.InitialDirectory = "c://";//初始路径
saveFileDialog1.Title = "";//初始文件名
if (type == "WAV")//WAV文件被保存
saveFileDialog1.Filter = "all file|\*.\*|wav|\*.wav";
else
saveFileDialog1.Filter = "all file|\*.\*|pcm|\*.pcm";
saveFileDialog1.FilterIndex = ;
if (saveFileDialog1.ShowDialog() == DialogResult.OK) return saveFileDialog1.FileName;
else return "";
}
/// <summary>
/// 获取文件被保存的名 button2&& button4
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2\_Click(object sender, EventArgs e)
{
txtPcm2Wav\_wav.Text = getSaveFileName("PCM");
}
/// <summary>
/// wav->pcm
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnWav2Pcm\_Click(object sender, EventArgs e)
{
}
/// <summary>
/// 写文件操作
/// </summary>
/// <param name="filename">文件路径</param>
/// <param name="pbuff">文件数据</param>
private void WriteFile(string filename, byte\[\] pbuff)
{
if (File.Exists(filename) == true)
File.Delete(filename);
FileStream sw = File.OpenWrite(filename);
if (pbuff != null && sw != null)
{
sw.Write(pbuff, , pbuff.Length);
sw.Close();
}
}
/// <summary>
/// pcm->wav
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPcm2Wav\_Click(object sender, EventArgs e)
{
}
private void button5\_Click(object sender, EventArgs e)
{
if (readWav(txtWav2Pcm\_pcm.Text.Trim()) == true)
{
WriteFile(txtPcm2Wav\_wav.Text.Trim(), databuff);
lstMessage.Items.Add("PCM文件转换成功!" + System.DateTime.Now.ToString());
}
}
private void button3\_Click(object sender, EventArgs e)
{
try
{
if (readPcm(textBox1.Text) && InitHeader())
{
WriteFile(textBox2.Text, databuff);
lstMessage.Items.Add("WAVA文件转换成功!" + System.DateTime.Now.ToString());
}
}
catch (Exception ex)
{
lstMessage.Items.Add(ex.Message);
}
}
private void button6\_Click(object sender, EventArgs e)
{
textBox1.Text = getOpenFileName("PCM");
}
private void button4\_Click(object sender, EventArgs e)
{
textBox2.Text = getSaveFileName("WAV");
}
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章