C# - MP3-as állományok információinak lekérdezése

forráskód letöltése
Amikor az MPEG (Motion Picture Experts Group) csoport megalkotta a zenei állományok új szabványát, a MPEG 1 – Layer 3 Standard-ot (röviden MP3), gyökeres változások jöttek a zenei piac területén. Az új formátum népszerűsége – nem véletlenül – ma is töretlen. Cikkünkben megvizsgáljuk, hogyan tudjuk kinyerni egy adott MP3-as zenei állomány előadójára, a szám címére és az album nevére vonatkozó információkat. Mindezek ismeretében már könnyen készíthető egy MP3-as regiszter.
A program zenei állományt futtató funkciójának használatához rendelkeznünk kell valamilyen, a zenei állományok lejátszására alkalmas programmal.
Az MP3 szabvány értelmében az ilyen kiterjesztéssel rendelkező állományok információikat tekintve önleíróak, vagyis a bináris adatfolyam egy bizonyos részszakaszában tárolják az előadóra, az album és a zeneszám címére, valamint a kiadás évére vonatkozó információkat.
Az állomány rendelkezik egy 128 bájt hosszúságú fejrésszel, melyben a „TAG” karakterlánc vezeti be az információs bájtfolyamot, és amelyet meghatározott bájt hosszúságban követ a többi információs karakter. Lássuk, hogyan nyerhetjük ezt ki.
A programunkban a LEKÉRDEZÉS gomb segítségével érhetjük el, hogy a megadott állományból kinyerjük a kérdéses információkat. A megoldáshoz a System.Text és a System.IO névtér osztályait fogjuk felhasználni.
A megoldás első lépése, hogy a megadott állománynévről eldöntjük, hogy létezik-e. Amennyiben igen, akkor megnyitjuk azt olvasásra úgy, hogy az eredmény-adatfolyamot egy FileStream objektumnak adjuk át.
if(File.Exists(textBox1.Text))
{
  FileInfo fi = new FileInfo(textBox1.Text);
  FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None);
A bájtfolyam tárolására szükségünk van egy bájttömbre.
byte[] b = new byte[128];
Az adatfolyam objektumának Seek metódusával a szükséges információhalmaz első bájtjára pozícionálunk.
fs.Seek(-128, SeekOrigin.End);
Létrehozunk egy BinaryReader objektumot, melyet összekapcsolunk az adatfolyammal, és megadjuk a dekódolás mikéntjét is, mely jelen esetben Default.
BinaryReader br = new BinaryReader(fs,System.Text.Encoding.Default);
A BinaryReader objektum Read metódusával betöltjük az adatfolyamot a bájttömbbe.
br.Read(b,0,128);
Létrehozunk egy karaktertömböt, valamint egy Decored objektumot.
char[] c = new char[b.Length];
Decoder d = Encoding.Default.GetDecoder();
A Decored objektum segítségével a megfelelő dekódolást alkalmazva kiolvassuk a bájttömb információit a karaktertömbbe.
d.GetChars(b, 0, b.Length, c, 0);
Ezt követően egy karakterláncba olvassuk a karakterlánc elemeit, mely már a végleges, feldolgozható adathalmazt tartalmazza.
string tag = "";
for(int i=0;i<c.Length;i++)
{
  tag += c[i].ToString();
}
A karakterlánc első három karakterét megvizsgálva eldöntjük, hogy az a „TAG” részláncot tartalmazza-e, vagy sem. Amennyiben igen, akkor elkezdjük a feldolgozást.
string h = tag.Substring(0, 3);
if(h == "TAG")
{
A karakterlánc 3-adik és 30-adik karakter közötti részlánca tartalmazza a zeneszám nevét.
  textBox4.Text = tag.Substring(3, 30);
A következő részlánc az előadó nevét hordozza.
  textBox2.Text = tag.Substring(33, 30);
Négy karakteren a kiadás évét is megtaláljuk.
  textBox3.Text = tag.Substring(93, 4);
Az album címe és egy kis megjegyzés számára is van hely, melyet kiolvasunk.
  textBox5.Text = tag.Substring(63, 30);
  textBox6.Text = tag.Substring(97, 30);
  ...
Mindezen törekvésünk azonban csak akkor vezet eredményre, ha az állomány kódjában megtalálhatóak ezek az információk. A példa tesztelésekor találkoztunk olyan állománnyal, mely semmilyen információt nem tartalmazott a zeneszám címén kívül.