2011-04-25 165 views
3

Hy!
我想从C#(wpf)中的音频文件(标题,艺术家等)中获取一些信息。该MediaElement的不提供这个选项,所以我用这个代码(直接读取的字节):WPF C#,从音频文件中获取信息

public string[] GetAudioFileInfo(string path) 
    { 
     path = Uri.UnescapeDataString(path); 

     byte[] b = new byte[128]; 
     string[] infos = new string[5]; //Title; Singer; Album; Year; Comm; 
     bool isSet = false; 

     //Read bytes 
     try 
     { 
      FileStream fs = new FileStream(path, FileMode.Open); 
      fs.Seek(-128, SeekOrigin.End); 
      fs.Read(b, 0, 128); 
      //Set flag 
      String sFlag = System.Text.Encoding.Default.GetString(b, 0, 3); 
      if (sFlag.CompareTo("TAG") == 0) isSet = true; 

      if (isSet) 
      { 
       infos[0] = System.Text.Encoding.Default.GetString(b, 3, 30); //Title 
       infos[1] = System.Text.Encoding.Default.GetString(b, 33, 30); //Singer 
       infos[2] = System.Text.Encoding.Default.GetString(b, 63, 30); //Album 
       infos[3] = System.Text.Encoding.Default.GetString(b, 93, 4); //Year 
       infos[4] = System.Text.Encoding.Default.GetString(b, 97, 30); //Comm 
      } 
      fs.Close(); 
      fs.Dispose(); 
     } 
     catch (IOException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

     return infos; 
    } 

这段代码的问题,有时它没有给予充分的标题或仅代表小立方体。 (如果我在MeidaPlayer中打开媒体,比我可以看到完整的标题)
我不确定GetString(byte [],int,int)的参数,也许我在那里犯错误。

在我prgram:This is the result
在媒体播放器:enter image description here

+0

什么文件格式?你在哪里得到你在GetString调用中使用的数字? – Justin 2011-04-25 20:05:13

+0

mp3和wav。我尝试了几次不同的值,但通过这个值,我得到了立方体。 – SeBee 2011-04-25 20:15:06

回答

2

您正在阅读的ID3v1 header,这限制了标题为30个字符。另外,比这更短的任何东西都会填充空格或零,后者将转换为您看到的框。你需要使用类似剥夺那些关:

myString = myString.Replace("\0", "") 

机会是媒体播放器读取的ID3v1扩展标签,这是您正在阅读的头之前。有关更多信息,请参阅上面的链接。但是,它实际上是在读取128个字节之前的227个字节。

在扩展标题中,标题(和其他)限制为60个字符,而不是30.

+0

谢谢你的答案:)现在它的工作 – SeBee 2011-04-25 20:48:53