查看: 2173|回复: 0

[.NET开发] C#实现获取mp3 Tag信息的方法

发表于 2018-2-18 20:04:04

本文实例讲述了C#实现获取mp3 Tag信息的方法。分享给大家供大家参考,具体如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. namespace Foxer_Player_1._1
  6. {
  7. public struct Mp3Info
  8. {
  9. public string identify; //TAG,三个字节
  10. public string Title; //歌曲名,30个字节
  11. public string Artist; //歌手名,30个字节
  12. public string Album; //所属唱片,30个字节
  13. public string Year; //年,4个字符
  14. public string Comment; //注释,28个字节
  15. public char reserved1; //保留位,一个字节
  16. public char reserved2; //保留位,一个字节
  17. public char reserved3; //保留位,一个字节
  18. }
  19. /// <summary>
  20. /// Mp3文件信息类
  21. /// </summary>
  22. public class Mp3FileInfo
  23. {
  24. Mp3Info info;
  25. /// <summary>
  26. /// 构造函数,输入文件名即得到信息
  27. /// </summary>
  28. /// <param name="mp3FilePos"></param>
  29. public Mp3FileInfo(String mp3FilePos)
  30. {
  31. info = getMp3Info(getLast128(mp3FilePos));
  32. }
  33. /// <summary>
  34. /// 获取整理后的Mp3文件名,这里以标题和艺术家名定文件名
  35. /// </summary>
  36. /// <returns></returns>
  37. public String GetOriginalName()
  38. {
  39. return formatString(info.Title.Trim()) + "-" + formatString(info.Artist.Trim());
  40. }
  41. /// <summary>
  42. /// 去除\0字符
  43. /// </summary>
  44. /// <param name="str"></param>
  45. /// <returns></returns>
  46. private static String formatString(String str)
  47. {
  48. return str.Replace("\0", "");
  49. }
  50. /// <summary>
  51. /// 获取MP3文件最后128个字节
  52. /// </summary>
  53. /// <param name="FileName">文件名</param>
  54. /// <returns>返回字节数组</returns>
  55. public static byte[] getLast128(string FileName)
  56. {
  57. FileStream fs = new FileStream(FileName, FileMode.Open, Fileaccess.Read);
  58. Stream stream = fs;
  59. stream.Seek(-128, SeekOrigin.End);
  60. const int seekPos = 128;
  61. int rl = 0;
  62. byte[] Info = new byte[seekPos];
  63. rl = stream.Read(Info, 0, seekPos);
  64. fs.Close();
  65. stream.Close();
  66. return Info;
  67. }
  68. /// <summary>
  69. /// 获取MP3歌曲的相关信息
  70. /// </summary>
  71. /// <param name = "Info">从MP3文件中截取的二进制信息</param>
  72. /// <returns>返回一个Mp3Info结构</returns>
  73. public static Mp3Info getMp3Info(byte[] Info)
  74. {
  75. Mp3Info mp3Info = new Mp3Info();
  76. string str = null;
  77. int i;
  78. int position = 0;//循环的起始值
  79. int currentIndex = 0;//Info的当前索引值
  80. //获取TAG标识
  81. for (i = currentIndex; i < currentIndex + 3; i++)
  82. {
  83. str = str + (char)Info[i];
  84. position++;
  85. }
  86. currentIndex = position;
  87. mp3Info.identify = str;
  88. //获取歌名
  89. str = null;
  90. byte[] bytTitle = new byte[30];//将歌名部分读到一个单独的数组中
  91. int j = 0;
  92. for (i = currentIndex; i < currentIndex + 30; i++)
  93. {
  94. bytTitle[j] = Info[i];
  95. position++;
  96. j++;
  97. }
  98. currentIndex = position;
  99. mp3Info.Title = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytTitle);
  100. //获取歌手名
  101. str = null;
  102. j = 0;
  103. byte[] bytArtist = new byte[30];//将歌手名部分读到一个单独的数组中
  104. for (i = currentIndex; i < currentIndex + 30; i++)
  105. {
  106. bytArtist[j] = Info[i];
  107. position++;
  108. j++;
  109. }
  110. currentIndex = position;
  111. mp3Info.Artist = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytArtist);
  112. //获取唱片名
  113. str = null;
  114. j = 0;
  115. byte[] bytAlbum = new byte[30];//将唱片名部分读到一个单独的数组中
  116. for (i = currentIndex; i < currentIndex + 30; i++)
  117. {
  118. bytAlbum[j] = Info[i];
  119. position++;
  120. j++;
  121. }
  122. currentIndex = position;
  123. mp3Info.Album = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytAlbum);
  124. //获取年
  125. str = null;
  126. j = 0;
  127. byte[] bytYear = new byte[4];//将年部分读到一个单独的数组中
  128. for (i = currentIndex; i < currentIndex + 4; i++)
  129. {
  130. bytYear[j] = Info[i];
  131. position++;
  132. j++;
  133. }
  134. currentIndex = position;
  135. mp3Info.Year = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytYear);
  136. //获取注释
  137. str = null;
  138. j = 0;
  139. byte[] bytComment = new byte[28];//将注释部分读到一个单独的数组中
  140. for (i = currentIndex; i < currentIndex + 25; i++)
  141. {
  142. bytComment[j] = Info[i];
  143. position++;
  144. j++;
  145. }
  146. currentIndex = position;
  147. mp3Info.Comment = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytComment);
  148. //以下获取保留位
  149. mp3Info.reserved1 = (char)Info[++position];
  150. mp3Info.reserved2 = (char)Info[++position];
  151. mp3Info.reserved3 = (char)Info[++position];
  152. return mp3Info;
  153. }
  154. /// <summary>
  155. /// 将字节数组转换成字符串
  156. /// </summary>
  157. /// <param name = "b">字节数组</param>
  158. /// <returns>返回转换后的字符串</returns>
  159. public static string byteToString(byte[] b)
  160. {
  161. Encoding enc = Encoding.GetEncoding("GB2312");
  162. string str = enc.GetString(b);
  163. str = str.Substring(0, str.IndexOf("#CONTENT#") >= 0 ? str.IndexOf("#CONTENT#") : str.Length);//去掉无用字符
  164. return str;
  165. }
  166. }
  167. }
复制代码

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#文件操作常用技巧汇总》、《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

您可能感兴趣的文章:

  • 通过C#动态生成图书信息XML文件
  • C#获得文件属性信息的实现方法
  • C#获取程序文件相关信息的方法
  • C#实现简单播放mp3的方法
  • C#定义的MP3播放类实例
  • C#获取指定文件著作权信息的方法
  • C#获取文件相关信息的方法
  • C#使用shell32获取文件属性的方法
  • C#编程实现动态改变配置文件信息的方法
  • C#基于OLEDB获取Excel文件表结构信息的方法


回复

使用道具 举报