C#实现获取mp3 Tag信息的方法

发布时间 - 2026-01-11 02:11:04    点击率:

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

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Foxer_Player_1._1
{
  public struct Mp3Info
  {
    public string identify;   //TAG,三个字节
    public string Title;    //歌曲名,30个字节
    public string Artist;    //歌手名,30个字节
    public string Album;    //所属唱片,30个字节
    public string Year;     //年,4个字符
    public string Comment;   //注释,28个字节
    public char reserved1;   //保留位,一个字节
    public char reserved2;   //保留位,一个字节
    public char reserved3;   //保留位,一个字节
  }
  /// <summary>
  /// Mp3文件信息类
  /// </summary>
  public class Mp3FileInfo
  {
    Mp3Info info;
    /// <summary>
    /// 构造函数,输入文件名即得到信息
    /// </summary>
    /// <param name="mp3FilePos"></param>
    public Mp3FileInfo(String mp3FilePos)
    {
      info = getMp3Info(getLast128(mp3FilePos));
    }
    /// <summary>
    /// 获取整理后的Mp3文件名,这里以标题和艺术家名定文件名
    /// </summary>
    /// <returns></returns>
    public String GetOriginalName()
    {
      return formatString(info.Title.Trim()) + "-" + formatString(info.Artist.Trim());
    }
    /// <summary>
    /// 去除\0字符
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private static String formatString(String str)
    {
      return str.Replace("\0", "");
    }
    /// <summary>
    /// 获取MP3文件最后128个字节
    /// </summary>
    /// <param name="FileName">文件名</param>
    /// <returns>返回字节数组</returns>
    public static byte[] getLast128(string FileName)
    {
      FileStream fs = new FileStream(FileName, FileMode.Open, Fileaccess.Read);
      Stream stream = fs;
      stream.Seek(-128, SeekOrigin.End);
      const int seekPos = 128;
      int rl = 0;
      byte[] Info = new byte[seekPos];
      rl = stream.Read(Info, 0, seekPos);
      fs.Close();
      stream.Close();
      return Info;
    }
    /// <summary>
    /// 获取MP3歌曲的相关信息
    /// </summary>
    /// <param name = "Info">从MP3文件中截取的二进制信息</param>
    /// <returns>返回一个Mp3Info结构</returns>
    public static Mp3Info getMp3Info(byte[] Info)
    {
      Mp3Info mp3Info = new Mp3Info();
      string str = null;
      int i;
      int position = 0;//循环的起始值
      int currentIndex = 0;//Info的当前索引值
      //获取TAG标识
      for (i = currentIndex; i < currentIndex + 3; i++)
      {
        str = str + (char)Info[i];
        position++;
      }
      currentIndex = position;
      mp3Info.identify = str;
      //获取歌名
      str = null;
      byte[] bytTitle = new byte[30];//将歌名部分读到一个单独的数组中
      int j = 0;
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytTitle[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Title = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytTitle);
      //获取歌手名
      str = null;
      j = 0;
      byte[] bytArtist = new byte[30];//将歌手名部分读到一个单独的数组中
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytArtist[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Artist = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytArtist);
      //获取唱片名
      str = null;
      j = 0;
      byte[] bytAlbum = new byte[30];//将唱片名部分读到一个单独的数组中
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytAlbum[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Album = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytAlbum);
      //获取年
      str = null;
      j = 0;
      byte[] bytYear = new byte[4];//将年部分读到一个单独的数组中
      for (i = currentIndex; i < currentIndex + 4; i++)
      {
        bytYear[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Year = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytYear);
      //获取注释
      str = null;
      j = 0;
      byte[] bytComment = new byte[28];//将注释部分读到一个单独的数组中
      for (i = currentIndex; i < currentIndex + 25; i++)
      {
        bytComment[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Comment = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytComment);
      //以下获取保留位
      mp3Info.reserved1 = (char)Info[++position];
      mp3Info.reserved2 = (char)Info[++position];
      mp3Info.reserved3 = (char)Info[++position];
      return mp3Info;
    }
    /// <summary>
    /// 将字节数组转换成字符串
    /// </summary>
    /// <param name = "b">字节数组</param>
    /// <returns>返回转换后的字符串</returns>
    public static string byteToString(byte[] b)
    {
      Encoding enc = Encoding.GetEncoding("GB2312");
      string str = enc.GetString(b);
      str = str.Substring(0, str.IndexOf("#CONTENT#") >= 0 ? str.IndexOf("#CONTENT#") : str.Length);//去掉无用字符
      return str;
    }
  }
}

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

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


# C#  # 获取  # mp3  # Tag信息  # C#定义的MP3播放类实例  # C#实现简单播放mp3的方法  # C#基于OLEDB获取Excel文件表结构信息的方法  # C#编程实现动态改变配置文件信息的方法  # C#获取文件相关信息的方法  # C#获取指定文件著作权信息的方法  # C#获取程序文件相关信息的方法  # C#获得文件属性信息的实现方法  # 通过C#动态生成图书信息XML文件  # C#使用shell32获取文件属性的方法  # 读到  # 组中  # 程序设计  # 唱片名  # 相关内容  # 遍历  # 感兴趣  # 数据结构  # 给大家  # 相关信息  # 转换成  # 更多关于  # 所述  # 使用技巧  # 面向对象  # 讲述了  # char  # lt  # Artist  # Album 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何与Inertia.js和Vue/React构建现代单页应用  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何快速登录WAP自助建站平台?  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何配置任务调度?(Cron Job示例)  个人网站制作流程图片大全,个人网站如何注销?  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何快速搭建安全的FTP站点?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么连接多个数据库_Laravel多数据库连接配置  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何用PHP快速搭建CMS系统?  如何自定义建站之星模板颜色并下载新样式?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何用AWS免费套餐快速搭建高效网站?  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel如何实现事件和监听器?(Event & Listener实战)  如何续费美橙建站之星域名及服务?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  利用JavaScript实现拖拽改变元素大小  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  nginx修改上传文件大小限制的方法  创业网站制作流程,创业网站可靠吗?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  nodejs redis 发布订阅机制封装实现方法及实例代码  Linux网络带宽限制_tc配置实践解析【教程】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel如何实现用户注册和登录?(Auth脚手架指南)