1. public class WaveHelper
  2. {
  3. /// <summary>
  4. /// 数据流
  5. /// </summary>
  6. private Stream m_WaveData;
  7.  
  8. private bool m_WaveBool = false;
  9.  
  10. private RIFF_WAVE_Chunk _Header = new RIFF_WAVE_Chunk();
  11. private Format_Chunk _Format = new Format_Chunk();
  12. private Fact_Chunk _Fact = new Fact_Chunk();
  13. private Data_Chunk _Data = new Data_Chunk();
  14. public WaveHelper(string WaveFileName)
  15. {
  16. m_WaveData = new FileStream(WaveFileName, FileMode.Open);
  17. try
  18. {
  19. LoadWave();
  20. m_WaveData.Close();
  21. }
  22. catch
  23. {
  24. m_WaveData.Close();
  25. }
  26. }
  27. public WaveHelper(Stream WaveStream)
  28. {
  29. m_WaveData = WaveStream;
  30. try
  31. {
  32. LoadWave();
  33. m_WaveData.Close();
  34. }
  35. catch
  36. {
  37. m_WaveData.Close();
  38. }
  39. }
  40. private void LoadWave()
  41. {
  42. #region RIFF_WAVE_Chunk
  43. byte[] _Temp4 = new byte[];
  44. byte[] _Temp2 = new byte[];
  45. m_WaveData.Read(_Temp4, , );
  46. if (_Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[]) return;
  47. m_WaveData.Read(_Temp4, , );
  48. _Header.dwRiffSize = BitConverter.ToUInt32(_Temp4, );
  49. m_WaveData.Read(_Temp4, , );
  50. if (_Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[]) return;
  51.  
  52. #endregion
  53. #region Format_Chunk
  54. m_WaveData.Read(_Temp4, , );
  55. if (_Temp4[] != _Format.ID[] || _Temp4[] != _Format.ID[] || _Temp4[] != _Format.ID[]) return;
  56. m_WaveData.Read(_Temp4, , );
  57. _Format.Size = BitConverter.ToUInt32(_Temp4, );
  58. long _EndWave = _Format.Size + m_WaveData.Position;
  59. m_WaveData.Read(_Temp2, , );
  60. _Format.FormatTag = BitConverter.ToUInt16(_Temp2, );
  61. m_WaveData.Read(_Temp2, , );
  62. _Format.Channels = BitConverter.ToUInt16(_Temp2, );
  63. m_WaveData.Read(_Temp4, , );
  64. _Format.SamlesPerSec = BitConverter.ToUInt32(_Temp4, );
  65. m_WaveData.Read(_Temp4, , );
  66. _Format.AvgBytesPerSec = BitConverter.ToUInt32(_Temp4, );
  67. m_WaveData.Read(_Temp2, , );
  68. _Format.BlockAlign = BitConverter.ToUInt16(_Temp2, );
  69. m_WaveData.Read(_Temp2, , );
  70. _Format.BitsPerSample = BitConverter.ToUInt16(_Temp2, );
  71. m_WaveData.Position += _EndWave - m_WaveData.Position;
  72. #endregion
  73. m_WaveData.Read(_Temp4, , );
  74. if (_Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[])
  75. {
  76. #region Fact_Chunk
  77. m_WaveData.Read(_Temp4, , );
  78. _Fact.Size = BitConverter.ToUInt32(_Temp4, );
  79. m_WaveData.Position += _Fact.Size;
  80. #endregion
  81. m_WaveData.Read(_Temp4, , );
  82. }
  83. if (_Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[])
  84. {
  85. #region Data_Chunk
  86. m_WaveData.Read(_Temp4, , );
  87. _Data.Size = BitConverter.ToUInt32(_Temp4, );
  88. _Data.FileBeginIndex = m_WaveData.Position;
  89. _Data.FileOverIndex = m_WaveData.Position + _Data.Size;
  90. m_Second = (double)_Data.Size / (double)_Format.AvgBytesPerSec;
  91. #endregion
  92. }
  93.  
  94. m_WaveBool = true;
  95.  
  96. }
  97. #region 文件定义
  98. /// <summary>
  99. /// 文件头
  100. /// </summary>
  101. private class RIFF_WAVE_Chunk
  102. {
  103. /// <summary>
  104. /// 文件前四个字节 为RIFF
  105. /// </summary>
  106. public byte[] szRiffID = new byte[] { 0x52, 0x49, 0x46, 0x46 }; // 'R','I','F','F'
  107. /// <summary>
  108. /// 数据大小 这个数字等于+8 =文件大小
  109. /// </summary>
  110. public uint dwRiffSize = ;
  111. /// <summary>
  112. ///WAVE文件定义 为WAVE
  113. /// </summary>
  114. public byte[] szRiffFormat = new byte[] { 0x57, 0x41, 0x56, 0x45 }; // 'W','A','V','E'
  115. }
  116. /// <summary>
  117. /// 声音内容定义
  118. /// </summary>
  119. private class Format_Chunk
  120. {
  121. /// <summary>
  122. /// 固定为 是"fmt "字后一位为0x20
  123. /// </summary>
  124. public byte[] ID = new byte[] { 0x66, 0x6D, 0x74, 0x20 };
  125. /// <summary>
  126. /// 区域大小
  127. /// </summary>
  128. public uint Size = ;
  129. /// <summary>
  130. /// 记录着此声音的格式代号,例如1-WAVE_FORMAT_PCM, 2-WAVE_F0RAM_ADPCM等等。
  131. /// </summary>
  132. public ushort FormatTag = ;
  133. /// <summary>
  134. /// 声道数目,1--单声道;2--双声道
  135. /// </summary>
  136. public ushort Channels = ;
  137. /// <summary>
  138. /// 采样频率 一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种
  139. /// </summary>
  140. public uint SamlesPerSec = ;
  141. /// <summary>
  142. /// 每秒所需字节数
  143. /// </summary>
  144. public uint AvgBytesPerSec = ;
  145. /// <summary>
  146. /// 数据块对齐单位(每个采样需要的字节数)
  147. /// </summary>
  148. public ushort BlockAlign = ;
  149. /// <summary>
  150. /// 音频采样大小
  151. /// </summary>
  152. public ushort BitsPerSample = ;
  153. /// <summary>
  154. /// ???
  155. /// </summary>
  156. public byte[] Temp = new byte[];
  157. }
  158. /// <summary>
  159. /// FACT
  160. /// </summary>
  161. private class Fact_Chunk
  162. {
  163. /// <summary>
  164. /// 文件前四个字节 为fact
  165. /// </summary>
  166. public byte[] ID = new byte[] { 0x66, 0x61, 0x63, 0x74 }; // 'f','a','c','t'
  167. /// <summary>
  168. /// 数据大小
  169. /// </summary>
  170. public uint Size = ;
  171. /// <summary>
  172. /// 临时数据
  173. /// </summary>
  174. public byte[] Temp;
  175. }
  176. /// <summary>
  177. /// 数据区
  178. /// </summary>
  179. private class Data_Chunk
  180. {
  181. /// <summary>
  182. /// 文件前四个字节 为RIFF
  183. /// </summary>
  184. public byte[] ID = new byte[] { 0x64, 0x61, 0x74, 0x61 }; // 'd','a','t','a'
  185. /// <summary>
  186. /// 大小
  187. /// </summary>
  188. public uint Size = ;
  189. /// <summary>
  190. /// 开始播放的位置
  191. /// </summary>
  192. public long FileBeginIndex = ;
  193. /// <summary>
  194. /// 结束播放的位置
  195. /// </summary>
  196. public long FileOverIndex = ;
  197. }
  198. #endregion
  199. #region 属性
  200. /// <summary>
  201. /// 是否成功打开文件
  202. /// </summary>
  203. public bool WaveBool { get { return m_WaveBool; } }
  204. private double m_Second = ;
  205. /// <summary>
  206. /// 秒单位
  207. /// </summary>
  208. public double Second { get { return m_Second; } }
  209. /// <summary>
  210. /// 格式
  211. /// </summary>
  212. public string FormatTag
  213. {
  214. get
  215. {
  216. switch (_Format.FormatTag)
  217. {
  218. case :
  219. return "PCM";
  220. case :
  221. return "Microsoft ADPCM";
  222. default:
  223. return "Un";
  224. }
  225. }
  226. }
  227. /// <summary>
  228. /// 频道
  229. /// </summary>
  230. public ushort Channels { get { return _Format.Channels; } }
  231. /// <summary>
  232. /// 采样级别
  233. /// </summary>
  234. public string SamlesPerSec
  235. {
  236. get
  237. {
  238. //switch (_Format.SamlesPerSec)
  239. //{
  240. // case 11025:
  241. // return "11kHz";
  242. // case 22050:
  243. // return "22kHz";
  244. // case 44100:
  245. // return "44kHz";
  246. // default:
  247. // return _Format.SamlesPerSec.ToString() + "Hz";
  248. //}
  249. return _Format.SamlesPerSec.ToString();
  250. }
  251. }
  252.  
  253. /// <summary>
  254. /// 采样大小(比特率)
  255. /// </summary>
  256. public ushort BitsPerSample { get { return _Format.BitsPerSample; } }
  257. #endregion
  258. }

C# 获取wave文件信息【转】的更多相关文章

  1. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

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

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

  3. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  4. C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  5. PHP获取Mp3文件信息

    扫描本地MP3文件,获取文件信息

  6. 工作采坑札记:4. Hadoop获取InputSplit文件信息

    1. 场景 基于客户的数据处理需求,客户分发诸多小数据文件,文件每行代表一条记录信息,且每个文件以"类型_yyyyMMdd_批次号"命名.由于同一条记录可能存在于多个文件中,且处于 ...

  7. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  8. SQL SERVER获取数据库文件信息

        MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...

  9. 获取mp4文件信息

    计算电影长度 方法1 从mvhd - movie header atom中找到time scale和duration,duration除以time scale即是整部电影的长度. time scale ...

随机推荐

  1. Max Subsequence

    一个sequence,里面都是整数,求最长的subsequence的长度,使得这个subsquence的最大值和最小值相差不超过1. 比如[1,3,2,2,5,2,3,7]最长的subsequence ...

  2. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  3. MongoDB 副本集管理(不定时更新)

    简介: 前面介绍完了副本集的搭建.用户的管理.参数和日常操作的说明,那副本集搭建好该如何管理呢?现在来说明下副本集的日常查看和管理. 说明: 1)查看命令行参数:db.serverCmdLineOpt ...

  4. nyoj_31

    题目描述:五个数求最值. #include <iostream> #include <algorithm> using namespace std; int main(){ ] ...

  5. oracle,mysql对敏感,关键字等处理

    oracle用""  比如,处理字段中间有空格,

  6. DREAMWEAVER

    女孩儿!!!Coding之路,你没有什么不一样的!!!! 1024,程序员的节日,开会的时候,你对负责人说今天是我们的节日哎~~结果,得到的是负责人冷冰冰的眼神:“你还真把自己当程序员了!?” 一阵愣 ...

  7. js闭包原理

    一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ****定义在函数中的函数,并且可在外部访问得到.(正常情况下我们是无法 ...

  8. 25个增强iOS应用程序性能的提示和技巧(中级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(2) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  9. 二、获取微信用户openId

    /// <summary> /// 登录首页 /// </summary> /// <returns></returns> public ActionR ...

  10. 实现iOS前台时的推送弹窗效果

    原文链接 或许很多童鞋还不知道,在 iOS 中收到推送通知时,如果 App 处于前台运行的情况下,推送的顶部弹窗是不会弹出来的. 然而就是有很多**的产品经理都会提出类似这样的**需求:那就是在 Ap ...