如mp3的长度、比特率等等

解决方案 »

  1.   

    namespace id3 
    {  using System;
      using System.IO;
      using System.Text;
      
      class FileCommands 
      {
    public static void readMP3Tag (ref MP3 paramMP3) 
    {
    // Read the 128 byte ID3 tag into a byte array
    FileStream oFileStream;
    oFileStream = new FileStream(paramMP3.fileComplete , FileMode.Open);
    byte[] bBuffer = new byte[128];
    oFileStream.Seek(-128, SeekOrigin.End);
    oFileStream.Read(bBuffer,0, 128);
    oFileStream.Close();
      
    // Convert the Byte Array to a String
    Encoding  instEncoding = new ASCIIEncoding();   // NB: Encoding is an Abstract class
    string id3Tag = instEncoding.GetString(bBuffer);
      
    // If there is an attched ID3 v1.x TAG then read it 
    if (id3Tag .Substring(0,3) == "TAG") 
    {
    paramMP3.id3Title       = id3Tag.Substring(  3, 30).Trim();
    paramMP3.id3Artist      = id3Tag.Substring( 33, 30).Trim();
    paramMP3.id3Album       = id3Tag.Substring( 63, 30).Trim();
    paramMP3.id3Year        = id3Tag.Substring( 93, 4).Trim();
    paramMP3.id3Comment     = id3Tag.Substring( 97,28).Trim();
      
    // Get the track number if TAG conforms to ID3 v1.1
    if (id3Tag[125]==0)
    paramMP3.id3TrackNumber = bBuffer[126];
    else
    paramMP3.id3TrackNumber = 0;
    paramMP3.id3Genre = bBuffer[127];
    paramMP3.hasID3Tag     = true;
    // ********* IF USED IN ANGER: ENSURE to test for non-numeric year
    }
    else 
    {
    // ID3 Tag not found so create an empty TAG in case the user saces later
    paramMP3.id3Title       = "";
    paramMP3.id3Artist      = "";
    paramMP3.id3Album       = "";
    paramMP3.id3Year        = "";
    paramMP3.id3Comment     = "";
    paramMP3.id3TrackNumber = 0;
    paramMP3.id3Genre       = 0;
    paramMP3.hasID3Tag      = false;
    }
    }
      
    public static void updateMP3Tag (ref MP3 paramMP3) 
    {
    // Trim any whitespace
    paramMP3.id3Title   = paramMP3.id3Title.Trim();
    paramMP3.id3Artist  = paramMP3.id3Artist.Trim();
    paramMP3.id3Album   = paramMP3.id3Album.Trim();
    paramMP3.id3Year    = paramMP3.id3Year.Trim();
    paramMP3.id3Comment = paramMP3.id3Comment.Trim();
      
    // Ensure all properties are correct size
    if (paramMP3.id3Title.Length > 30)   
    paramMP3.id3Title    = paramMP3.id3Title.Substring(0,30);
    if (paramMP3.id3Artist.Length > 30)  
    paramMP3.id3Artist   = paramMP3.id3Artist.Substring(0,30);
    if (paramMP3.id3Album.Length > 30)   
    paramMP3.id3Album    = paramMP3.id3Album.Substring(0,30);
    if (paramMP3.id3Year.Length > 4)     
    paramMP3.id3Year     = paramMP3.id3Year.Substring(0,4);
    if (paramMP3.id3Comment.Length > 28) 
    paramMP3.id3Comment  = paramMP3.id3Comment.Substring(0,28);
          
    // Build a new ID3 Tag (128 Bytes)
    byte[] tagByteArray = new byte[128];
    for ( int i = 0; i < tagByteArray.Length; i++ ) 
    tagByteArray[i] = 0; // Initialise array to nulls
      
    // Convert the Byte Array to a String
    Encoding  instEncoding = new ASCIIEncoding();   // NB: Encoding is an Abstract class // ************ To DO: Make a shared instance of ASCIIEncoding so we don't keep creating/destroying it
    // Copy "TAG" to Array
    byte[] workingByteArray = instEncoding.GetBytes("TAG"); 
    Array.Copy(workingByteArray, 0, tagByteArray, 0, workingByteArray.Length);
    // Copy Title to Array
    workingByteArray = instEncoding.GetBytes(paramMP3.id3Title);
    Array.Copy(workingByteArray, 0, tagByteArray, 3, workingByteArray.Length);
    // Copy Artist to Array
    workingByteArray = instEncoding.GetBytes(paramMP3.id3Artist);
    Array.Copy(workingByteArray, 0, tagByteArray, 33, workingByteArray.Length);
    // Copy Album to Array
    workingByteArray = instEncoding.GetBytes(paramMP3.id3Album);
    Array.Copy(workingByteArray, 0, tagByteArray, 63, workingByteArray.Length);
    // Copy Year to Array
    workingByteArray = instEncoding.GetBytes(paramMP3.id3Year);
    Array.Copy(workingByteArray, 0, tagByteArray, 93, workingByteArray.Length);
    // Copy Comment to Array
    workingByteArray = instEncoding.GetBytes(paramMP3.id3Comment);
    Array.Copy(workingByteArray, 0, tagByteArray, 97, workingByteArray.Length);
    // Copy Track and Genre to Array
    tagByteArray[126] = paramMP3.id3TrackNumber;
    tagByteArray[127] = paramMP3.id3Genre;
      
    // SAVE TO DISK: Replace the final 128 Bytes with our new ID3 tag
    FileStream oFileStream = new FileStream(paramMP3.fileComplete , FileMode.Open);
    if (paramMP3.hasID3Tag)
    oFileStream.Seek(-128, SeekOrigin.End);
    else
    oFileStream.Seek(0, SeekOrigin.End);
    oFileStream.Write(tagByteArray,0, 128);
    oFileStream.Close();
    paramMP3.hasID3Tag  = true;
    }
      }
      
      struct MP3 
      {
          public string  filePath;
          public string  fileFileName;
          public string  fileComplete;
          public bool    hasID3Tag;
          public string  id3Title;
          public string  id3Artist;
          public string  id3Album;
          public string  id3Year;
          public string  id3Comment;
          public byte    id3TrackNumber;
          public byte    id3Genre;
          
          // Required struct constructor
          public MP3(string path, string name) 
      {
    this.filePath     = path;
            this.fileFileName = name;
            this.fileComplete = path + "\\" + name;
            this.hasID3Tag    = false;
            this.id3Title   = null;
            this.id3Artist    = null;
            this.id3Album   = null;
            this.id3Year    = null;
            this.id3Comment   = null;
            this.id3TrackNumber = 0;
            this.id3Genre   = 0;
    }
      } 
    }