c# pcm
阅读原文时间:2023年07月13日阅读:3

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

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章