Hej,ID3-klass
Jag håller just nu på med ID3-klass för att kunna läsa ID3v1/v2-taggar. Jag har efter ett antal tester märkt att programmets minnesanvändning kommer upp i ~200MB när det läser vissa mp3-filer (Bara vissa) och går inte ner igen. Andra program har dock inga problem med att läsa dem så det är förmodligen inga fel på själva filen. Jag har läst specifikationen på http://www.id3.org men har inte sett något som är direkt fel. Hoppas någon kan hjälpa mig med detta... Jag bifogar en del av koden men skulle det behövas så kan jag lägga upp allt.
<code>
FileInfo myFileInfo = new FileInfo(myFileName);
FileStream myFileStream = myFileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader myBinaryReader = new BinaryReader(myFileStream);
myBinaryReader.BaseStream.Position = 0;
// Check for tag
hasID3v2 = (new string(myBinaryReader.ReadChars(3)) == "ID3");
if(!hasID3v2)
return;
// Read ID3 version
myID3v2Tags.myMajorVersion = myBinaryReader.ReadByte();
myID3v2Tags.myMinorVersion = myBinaryReader.ReadByte();
if(myID3v2Tags.MajorVersion >= 5)
{
hasID3v2 = false;
return;
}
// Read the flags
byte myFlags = myBinaryReader.ReadByte();
// Calculate tag length
int myTagLength = CalculateTagLength(myBinaryReader.ReadBytes(4));
if(myTagLength < myFileStream.Length && myTagLength < 2147483647)
{
while(myFileStream.Position < myTagLength)
{
string myFrameHeaderID = "";
int myFrameLength = 0;
byte[] myFrameHeaderFlags;
if(myID3v2Tags.MajorVersion == 2)
{
myFrameHeaderID = Encoding.ASCII.GetString(myBinaryReader.ReadBytes(3));
myFrameLength = CalculateFrameLength(myBinaryReader.ReadBytes(3));
}
else if(myID3v2Tags.MajorVersion == 3 || myID3v2Tags.MajorVersion == 4)
{
myFrameHeaderID = Encoding.ASCII.GetString(myBinaryReader.ReadBytes(4));
myFrameLength = CalculateFrameLength(myBinaryReader.ReadBytes(4));
myFrameHeaderFlags = myBinaryReader.ReadBytes(2);
}
else
{
hasID3v2 = false;
return;
}
if(myFrameHeaderID.Trim().Length <= 0 || myFrameLength <= 0)
return;
byte myFrameEncoding = myBinaryReader.ReadByte();
string myFrameInfo = "";
if(myFrameHeaderID == "COMM")
{
string myLanguage = Encoding.UTF7.GetString(myBinaryReader.ReadBytes(4));
myFrameInfo = Encoding.UTF7.GetString(myBinaryReader.ReadBytes(myFrameLength - 5));
}
else
{
myFrameInfo = Encoding.UTF7.GetString(myBinaryReader.ReadBytes(myFrameLength - 1));
}
if(myFrameInfo.Trim().Length > 0)
{
switch(myFrameHeaderID)
{
// MajorVersion = 2
case "TP1": myID3v2Tags.Artist = myFrameInfo; break;
case "TT2": myID3v2Tags.Title = myFrameInfo; break;
case "TAL": myID3v2Tags.Album = myFrameInfo; break;
case "TCO": myID3v2Tags.Genre = myFrameInfo; break;
case "COM": myID3v2Tags.Comment = myFrameInfo; break;
case "TYE": myID3v2Tags.Year = myFrameInfo; break;
case "TRK": myID3v2Tags.Track = myFrameInfo; break;
// MajorVersion > 2
case "TPE1": myID3v2Tags.Artist = myFrameInfo; break;
case "TIT2": myID3v2Tags.Title = myFrameInfo; break;
case "TALB": myID3v2Tags.Album = myFrameInfo; break;
case "TCON": myID3v2Tags.Genre = myFrameInfo; break;
case "COMM": myID3v2Tags.Comment = myFrameInfo; break;
case "TYER": myID3v2Tags.Year = myFrameInfo; break;
case "TRCK": myID3v2Tags.Track = myFrameInfo; break;
}
}
}
}
else
{
hasID3v2 = false;
}
myBinaryReader.Close();
myBinaryReader = null;
myFileStream.Close();
myFileStream = null;
myFileInfo = null;
</code>
/Micke