HY!
我想从C#(wpf)中的音频文件(标题,艺术家等)中获取一些信息。 MediaElement不提供此选项,因此我使用此代码(直接读取字节):
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)的参数,也许我在那里犯错误。
在我的文章中:
在媒体播放器中:
答案 0 :(得分:2)
您正在阅读ID3v1 header,将标题限制为30个字符。此外,任何比这短的东西都用空格或零填充,后者转换成你看到的方框。您需要使用以下内容删除它们:
myString = myString.Replace("\0", "")
媒体播放器可能正在读取ID3v1扩展标记,该标记位于您正在阅读的标题之前。有关更多信息,请参阅上面的链接。但它实际上是你正在读取的128个字节之前的227个字节。
在扩展标题中,标题(和其他标题)限制为60个字符,而不是30个字符。