17. august 2008 - 21:29Der er
14 kommentarer og 1 løsning
Læs en mp3 fil som tekst?
Hejsa igen -
jeg har prøvet i lang tid nu at få noget kode til at læse ID3 info'en i MP3 filer. Først prøvede jeg med nogle færdiglavede klasser jeg fandt på nettet men jeg kan ikke få nogle af dem til at fungere. Råd herom er velkomne.
Mit spørgsmål går på:
Hvis man henter en MP3 ind i Notepad står der selvfølgelig en masse underlige tegn. Men ID3 info'en står som ren tekst (i hvert fald hvis filen benytter version 1) i slutningen. Det starter med TAG (jfr. id3.ogr) og så resten af info'en efterfølgende.
Her er min kode:
[code] using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace kitty_ID3 { class id3v1 { public bool hasID3v1(string inputFilename) { string tmp = ""; FileStream file = new FileStream(inputFilename, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(inputFilename);
//tmp = reader.ToString(); tmp = file.ToString(); int found = tmp.IndexOf("TAG");
Jeg prøver at læse mp3 filer ind som rå tekst og søge efter ordet TAG men jeg kan ikke finde ud af det :P har prøvet hele weekenden men nu vil jeg spørge jer kloge hoveder.
using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace kitty_ID3 { class id3v1 { public string hasID3v1(string inputFilename) { string tmp = ""; StreamReader reader = File.OpenText(inputFilename); tmp = reader.ToString(); int found = tmp.IndexOf("TAG");
return found.ToString(); } } }
Dette har jeg nu prøvet. Jeg har fundet ud af at når jeg konverterer "reader" til en string, så bliver stringen bare "System.io ....reader..." så det duer ikke. Der må da være en måde at gøre det på :-/
Der er ingen grund til at søge efter TAG. Hvis der er et ID3v1-tag, udgør de de sidste 128 bytes i filen. Derfor kan du nøjes med at se på den del af filen for at bestemme om der er et ID3v1-tag (og hvad det indeholder).
Til at starte med skal du dog lige finde frem til det punkt. StreamReader har en property der hedder BaseStream, hvorpå du kan kalde Seek for at finde frem til de sidste 128 bytes.
Når du har gjort dette, har StreamReader en metode der hedder ReadToEnd() - så kan du få resten af filen ud (de sidste 128 bytes).
Der er dog lige et par ting du skal være opmærksom på: 1) Du skal have Encoding.Default med når du åbner filen, ellers er det ikke sikkert sådan noget som Æ, Ø og Å bliver vist korrekt (som udgangspunkt bruger StreamReader nemlig UTF-8, hvilket ikke er det der bruges til ID3v1). Det kan du bare ikke når du har valgt at bruge File.OpenText - brug i stedet new StreamReader(inputFilename, Encoding.Default). 2) Det er ikke nødvendigvis en god ting at du får det som en streng, eftersom det jo ikke *er* en lang streng - det er ikke engang det hele der er i tekstformat. Det var nok bedre om du definerede en struct med faste længder (jeg vil mene char[] er passende til teksterne, og så selvfølgelig de tilsvarende typer til resten af felterne).
ID3v2 er betydeligt mere kompliceret, men det er det de fleste filer benytter i dag. Samtidigt giver den mulighed for reel internationalisering, fordi man kan bruge Unicode.
som sagt så har jeg prøvet at bruge nogle af de der færdiglavede klasser til tingene, hvilket jeg ikke havde held med. jeg har læst på både id3v1 og v2 og da jeg kunne se at v1 var ret enkel valgte jeg at starte med den, og så gå videre til v2 når jeg følte jeg var klar.
Men jeg vil prøve at bruge det du har skrevet der - tak :)
using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace kitty_ID3 { class id3v1 { public string hasID3v1(string fileName) { StreamReader reader = new StreamReader(fileName); reader.BaseStream.Position = reader.BaseStream.Length - 128; return reader.ReadToEnd(); } } }
Det fungerer sådan som jeg vil have det indtil videre. Readtoend smider en string tilbage, så kan jeg først lave et tjek på ordet TAG i de første tre bytes, og så efter hvad jeg har brug for (titel, kunstner osv.) kan jeg ændre på basestream.position.
Husk lige at rydde op efter dig ved at lukke din StreamReader når du er færdig med den - godt nok er .NET garbage collected, så det sker på et tidspunkt, men det er dårlig kodestil (og kan risikere at skabe problemer på et senere tidspunkt).
Forskellen mellem 1 og 1.1 er meget lille, drejer sig om man har indraget lidt af description til at kunne angive en "genre", forskellen fra 1 og 1.1 til 2.x er rimelig stor, og i sin forstand har de to "intet" med hinanden at gøre, foruden den information de lagre.
Mellem 2.2 og 2.3/2.4 er der strukturelle forskelle i headeren. mens mellem 2.3 og 2.4 er der egentlig kun mindre forskelle. Og så vidt jeg husker bruger WinAmp stadig 2.3, så var det vi valgte at bruge i sin tid til primær udvikling.
Jeg har et dokument liggende som jeg skrev i sin tid, hvor jeg har prøvet at opsummere de forskellige tags i et mere "spiseligt" format end som hvis man læser standarderne som du da gerne må få lov at kigge.
Samtidig kan jeg godt dele lidt kode med dig omkring ID3v2.3.
Rent faktisk er det nu "Track number" der blev tilføjet, ikke genre - genre har altid været en del af ID3.
Hvis vi endelig skal ud i de ting, så er det også værd at huske at Winamp tilføjede en lang række genrer til ID3v1. De fleste ID3-genrelister har dem med nu om dage, da det mere eller mindre er blevet en de facto standard, men man kan komme ud for nogle der ikke har. En komplet liste kan eks. ses på http://dk2.php.net/manual/en/function.id3-get-genre-list.php.
(I øvrigt har Winamp haft understøttelse for ID3v2.4 siden februar 2006 - da 5.2 udkom)
har skam set der er mange forskellige versioner. Jeg har i sinde at mit program skal tage stilling til alle version. Har fundet masser af info på wikipedia :)
Skrevet ud fra standarderne på ID3's hjemmeside, men vil nu godt tage forbehold for de fejl der kan have sneget sig ind, men kan være det kan hjælpe...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.