久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

C#實現獲取mp3 Tag信息的方法

這篇文章主要介紹了C#實現獲取mp3 Tag信息的方法,涉及C#針對MP3文件屬性的相關操作技巧,需要的朋友可以參考下

本文實例講述了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# 將Access中以時間段條件查詢的數據添加到ListView中,需要的朋友可以參考下
這篇文章主要介紹了使用C#創建Windows服務的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
這篇文章主要介紹了C#身份證識別相關技術詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了C#中TCP粘包問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了C#實現的海盜分金算法,結合具體實例形式分析了海盜分金算法的原理與C#相應實現技巧,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了C#操作INI配置文件示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 日本三级日产三级国产三级 | 亚洲一区综合 | 成年免费大片黄在线观看岛国 | 中文字幕 在线观看 | 久久久www成人免费无遮挡大片 | 亚洲一区国产精品 | 亚洲国产中文在线 | 亚洲综合首页 | 麻豆av一区二区三区久久 | 综合久久国产 | www免费视频| 国产欧美一区二区三区久久人妖 | 9久9久| 亚洲国产成人精品久久久国产成人一区 | 日本二区 | 亚洲综合久久久 | 日本成人在线观看网站 | 国产一区二区在线91 | 午夜视频网站 | 成人精品毛片 | 日韩一级免费观看 | 亚洲黄色一级 | 久久久久久久国产精品视频 | 午夜精品一区二区三区在线观看 | 国产精品视频97 | 国产精品久久久久久久久久妞妞 | 色综合久久久久 | 岛国av免费在线观看 | 粉嫩av | 伊人激情网 | 成人黄视频在线观看 | 国内精品久久久久久 | 日韩欧美二区 | av一区二区三区四区 | 麻豆国产一区二区三区四区 | 中文字幕视频在线 | 日韩久久久久 | 免费午夜剧场 | 欧美日本久久 | 激情福利视频 | 成人精品鲁一区一区二区 |