public class WaveHelper{/// <summary>/// 数据流/// </summary>private Stream m_WaveData;private bool m_WaveBool = false;private RIFF_WAVE_Chunk _Header = new RIFF_WAVE_Chunk();private Format_Chunk _Format = new Format_Chunk();private Fact_Chunk _Fact = new Fact_Chunk();private Data_Chunk _Data = new Data_Chunk();public WaveHelper(string WaveFileName){m_WaveData = new FileStream(WaveFileName, FileMode.Open);try{LoadWave();m_WaveData.Close();}catch{m_WaveData.Close();}}public WaveHelper(Stream WaveStream){m_WaveData = WaveStream;try{LoadWave();m_WaveData.Close();}catch{m_WaveData.Close();}}private void LoadWave(){#region RIFF_WAVE_Chunkbyte[] _Temp4 = new byte[4];byte[] _Temp2 = new byte[2];m_WaveData.Read(_Temp4, 0, 4);if (_Temp4[0] != _Header.szRiffID[0] || _Temp4[1] != _Header.szRiffID[1] || _Temp4[2] != _Header.szRiffID[2] || _Temp4[3] != _Header.szRiffID[3]) return;m_WaveData.Read(_Temp4, 0, 4);_Header.dwRiffSize = BitConverter.ToUInt32(_Temp4, 0);m_WaveData.Read(_Temp4, 0, 4);if (_Temp4[0] != _Header.szRiffFormat[0] || _Temp4[1] != _Header.szRiffFormat[1] || _Temp4[2] != _Header.szRiffFormat[2] || _Temp4[3] != _Header.szRiffFormat[3]) return;#endregion#region Format_Chunkm_WaveData.Read(_Temp4, 0, 4);if (_Temp4[0] != _Format.ID[0] || _Temp4[1] != _Format.ID[1] || _Temp4[2] != _Format.ID[2]) return;m_WaveData.Read(_Temp4, 0, 4);_Format.Size = BitConverter.ToUInt32(_Temp4, 0);long _EndWave = _Format.Size + m_WaveData.Position;m_WaveData.Read(_Temp2, 0, 2);_Format.FormatTag = BitConverter.ToUInt16(_Temp2, 0);m_WaveData.Read(_Temp2, 0, 2);_Format.Channels = BitConverter.ToUInt16(_Temp2, 0);m_WaveData.Read(_Temp4, 0, 4);_Format.SamlesPerSec = BitConverter.ToUInt32(_Temp4, 0);m_WaveData.Read(_Temp4, 0, 4);_Format.AvgBytesPerSec = BitConverter.ToUInt32(_Temp4, 0);m_WaveData.Read(_Temp2, 0, 2);_Format.BlockAlign = BitConverter.ToUInt16(_Temp2, 0);m_WaveData.Read(_Temp2, 0, 2);_Format.BitsPerSample = BitConverter.ToUInt16(_Temp2, 0);m_WaveData.Position += _EndWave - m_WaveData.Position;#endregionm_WaveData.Read(_Temp4, 0, 4);if (_Temp4[0] == _Fact.ID[0] && _Temp4[1] == _Fact.ID[1] && _Temp4[2] == _Fact.ID[2] && _Temp4[3] == _Fact.ID[3]){#region  Fact_Chunkm_WaveData.Read(_Temp4, 0, 4);_Fact.Size = BitConverter.ToUInt32(_Temp4, 0);m_WaveData.Position += _Fact.Size;#endregionm_WaveData.Read(_Temp4, 0, 4);}if (_Temp4[0] == _Data.ID[0] && _Temp4[1] == _Data.ID[1] && _Temp4[2] == _Data.ID[2] && _Temp4[3] == _Data.ID[3]){#region Data_Chunkm_WaveData.Read(_Temp4, 0, 4);_Data.Size = BitConverter.ToUInt32(_Temp4, 0);_Data.FileBeginIndex = m_WaveData.Position;_Data.FileOverIndex = m_WaveData.Position + _Data.Size;m_Second = (double)_Data.Size / (double)_Format.AvgBytesPerSec;#endregion}m_WaveBool = true;}#region 文件定义/// <summary>/// 文件头/// </summary>private class RIFF_WAVE_Chunk{/// <summary>/// 文件前四个字节 为RIFF/// </summary>public byte[] szRiffID = new byte[] { 0x52, 0x49, 0x46, 0x46 };   // 'R','I','F','F'/// <summary>/// 数据大小 这个数字等于+8 =文件大小/// </summary>public uint dwRiffSize = 0;/// <summary>///WAVE文件定义 为WAVE/// </summary>public byte[] szRiffFormat = new byte[] { 0x57, 0x41, 0x56, 0x45 }; // 'W','A','V','E'
        }/// <summary>/// 声音内容定义/// </summary>private class Format_Chunk{/// <summary>/// 固定为  是"fmt "字后一位为0x20/// </summary>public byte[] ID = new byte[] { 0x66, 0x6D, 0x74, 0x20 };/// <summary>/// 区域大小/// </summary>public uint Size = 0;/// <summary>/// 记录着此声音的格式代号,例如1-WAVE_FORMAT_PCM, 2-WAVE_F0RAM_ADPCM等等。 /// </summary>public ushort FormatTag = 1;/// <summary>/// 声道数目,1--单声道;2--双声道/// </summary>public ushort Channels = 2;/// <summary>/// 采样频率  一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种/// </summary>public uint SamlesPerSec = 0;/// <summary>/// 每秒所需字节数/// </summary>public uint AvgBytesPerSec = 0;/// <summary>/// 数据块对齐单位(每个采样需要的字节数)/// </summary>public ushort BlockAlign = 0;/// <summary>/// 音频采样大小 /// </summary>public ushort BitsPerSample = 0;/// <summary>/// ???/// </summary>public byte[] Temp = new byte[2];}/// <summary>/// FACT/// </summary>private class Fact_Chunk{/// <summary>/// 文件前四个字节 为fact/// </summary>public byte[] ID = new byte[] { 0x66, 0x61, 0x63, 0x74 };   // 'f','a','c','t'/// <summary>/// 数据大小/// </summary>public uint Size = 0;/// <summary>/// 临时数据/// </summary>public byte[] Temp;}/// <summary>/// 数据区/// </summary>private class Data_Chunk{/// <summary>/// 文件前四个字节 为RIFF/// </summary>public byte[] ID = new byte[] { 0x64, 0x61, 0x74, 0x61 };   // 'd','a','t','a'/// <summary>/// 大小/// </summary>public uint Size = 0;/// <summary>/// 开始播放的位置/// </summary>public long FileBeginIndex = 0;/// <summary>/// 结束播放的位置/// </summary>public long FileOverIndex = 0;}#endregion#region 属性/// <summary>/// 是否成功打开文件/// </summary>public bool WaveBool { get { return m_WaveBool; } }private double m_Second = 0;/// <summary>/// 秒单位/// </summary>public double Second { get { return m_Second; } }/// <summary>/// 格式/// </summary>public string FormatTag{get{switch (_Format.FormatTag){case 1:return "PCM";case 2:return "Microsoft ADPCM";default:return "Un";}}}/// <summary>/// 频道/// </summary>public ushort Channels { get { return _Format.Channels; } }/// <summary>/// 采样级别/// </summary>public string SamlesPerSec{get{//switch (_Format.SamlesPerSec)//{//    case 11025://        return "11kHz";//    case 22050://        return "22kHz";//    case 44100://        return "44kHz";//    default://        return _Format.SamlesPerSec.ToString() + "Hz";//}return _Format.SamlesPerSec.ToString();}}/// <summary>/// 采样大小(比特率)/// </summary>public ushort BitsPerSample { get { return _Format.BitsPerSample; } }#endregion}

转载于:https://www.cnblogs.com/mahatmasmile/p/3493038.html

C# 获取wave文件信息【转】相关推荐

  1. php获取文件夹中的音乐文件_PHP获取音频文件信息的方法

    本篇文章主要介绍PHP获取音频文件信息的方法,感兴趣的朋友参考下,希望对大家有所帮助. 项目需求:现在有一个音频文件上传的功能,在上传后PHP需要获取这个音频文件的相关信息,例如:时长等,由于这个文件 ...

  2. C++:获取图片文件信息-图片名称、类型、像素宽高

    转自:C++ 获取图片文件信息 - 席纳霍霍 - 博客园 参考:图片头文件信息解析_adzcsx2的博客-CSDN博客_图片头文件 #include <gl/glut.h> #includ ...

  3. 获取log文件信息,并保存至Excel文件

    获取log文件信息,并保存至Excel文件 日常工作中,可能需要我们从txt文件中截取海量的信息,只要寻找到这种信息的规律或者定位好信息情况,在我的txt文件中有海量的信息,而我只需要截取09/11/ ...

  4. android播放器如何获取音乐文件信息

    转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...

  5. jaudiotagger获取MP3文件信息及封面图片

    #jaudiotagger获取MP3文件信息及封面图片 ###maven依赖: <dependency><groupId>org</groupId><arti ...

  6. 操作 Wave 文件(4): 获取 Wave 文件主块与子块的信息

    有两个相关的结构体: TMMIOInfo.TMMCKInfo. TMMIOInfo 是多媒体文件打开后的状态信息, mmioOpen 函数的第二个参数就是这个结构的指针. 现在先用到了 TMMCKIn ...

  7. Wave 文件(5): 获取 Wave 文件的格式信息

    装载格式信息的结构有: TWaveFormat = wFormatTag: Word;nChannels: Word;nSamplesPerSec: DWORD;nAvgBytesPerSec: DW ...

  8. Android通过MediaStore获取音乐文件信息的方法

    Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户.当手机开机或者 ...

  9. java mp3 信息_android,java获取MP3文件信息(作者,专辑等)

    接着上一篇文章, 上一篇把ndk开发遍历手机文件分享了一下.遍历出来的MP3文件,我需要展示在android的listview里面,想展示的好看一点,结果发现又是一个坑. 根据mp3文件,获取作者啊专 ...

最新文章

  1. 计算机系统安装和维护实验,2计算机系统安装维护实验报告.doc
  2. 虚拟机登服务器,用虚拟机登录云服务器
  3. Administrator用户被禁用
  4. 无法加载可扩展计数器_多核可扩展计数器
  5. Spring MVC 教程,快速入门,深入分析【转】
  6. Week4——Hello.java分析
  7. display属性值
  8. 小程序能打开html页面,小程序新功能直接打开网页
  9. 云视通手机下载的文件存储位置_小白版丨IPFS网络怎么存储、下载文件?怎么托管网站?...
  10. webview 禁用横竖屏切换_JS禁止横竖屏切换,强制横竖屏显示
  11. Python进行灰色关联度综合评价
  12. 软考答题卡如何填写,这些你都清楚吗?
  13. 软考高项你想要的全在这
  14. 【转载】任正非:鼓足干劲,力争上游,不畏一切艰难困苦
  15. 用java打暴雪星际争霸(2)——运行测试机器人
  16. 【mac 实现ai绘画自由安装指南】
  17. c语言求偶数的积,动物行为学1
  18. Python 命令行参数详解
  19. Android-音视频学习系列(一)-JNI-从入门到精通,android开发入门
  20. 微信小程序 - 按需注入

热门文章

  1. 这些常识一直在损害健康
  2. [推荐]最强最全的电脑硬件知识
  3. 我要一颗原子弹 -- 开发者思维
  4. Struts2学习小结
  5. 浏览器和服务器 对http请求(post get) url长度限制
  6. jdbc桥连接过程解析
  7. Javascript 装饰器极速指南
  8. Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据
  9. [转]解读ASP.NET 5 MVC6系列(7):依赖注入
  10. WebSocket API简介