Avatar billede lad Nybegynder
17. august 2008 - 21:29 Der 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");

            if (found > 0)
                return true;
            else
                return false;
        }
    }
}
[/code]

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.
Avatar billede arne_v Ekspert
17. august 2008 - 22:40 #1
file.ToString() returnerer ikke filens indhold

jeg vil tro at MP3 filer er binære og at man derfor ikke kan læse dem som tekst
Avatar billede lad Nybegynder
17. august 2008 - 23:13 #2
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å :-/
Avatar billede arne_v Ekspert
17. august 2008 - 23:35 #3
Du bliver jo nok nødt til at læse fra filen !

Jeg tror at du skal prøve at få noget eksisterende kode til at virke.

Men hvis du vil igang, så brug din Stream og led efter 3 bytes med 'T' 'A' 'G'.

Indholdet af resten af bytes er beskrevet i http://en.wikipedia.org/wiki/Id3
Avatar billede pidgeot Nybegynder
18. august 2008 - 13:58 #4
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).
Avatar billede lad Nybegynder
18. august 2008 - 14:41 #5
det er jeg skam godt klar over :) som sagt - mit spørgsmål er ikke hvad jeg skal men hvordan.
Avatar billede pidgeot Nybegynder
18. august 2008 - 14:55 #6
Det var lige så meget en oplysning til Arne ;)

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.
Avatar billede lad Nybegynder
18. august 2008 - 15:19 #7
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 :)
Avatar billede lad Nybegynder
18. august 2008 - 15:29 #8
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.

Mange tak :D
Avatar billede pidgeot Nybegynder
18. august 2008 - 15:33 #9
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).
Avatar billede lad Nybegynder
18. august 2008 - 15:47 #10
Tak igen :)
Avatar billede md_craig Nybegynder
20. august 2008 - 10:47 #11
Husk der er ikke kun 2 versioner af ID3 tags, men en række flere.

ID3v1, ID3v1.1, ID3v2.2 (obsolete), ID3v2.3, ID3v2.4

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.
Avatar billede pidgeot Nybegynder
20. august 2008 - 11:21 #12
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)
Avatar billede md_craig Nybegynder
20. august 2008 - 12:45 #13
Nårh ja... sad ikke med dokumentet foran mig, så det er lidt lang tid siden jeg har rodet med det sidst så.

Og ja, Winamp har understøttelse for ID3v2.4 men den winamp vi brugte i sin tid, (2007) gemte stadig i 2.3 format. (ikke at der er den store forskel).

Og genrelisten + Winamp tilføjelser er desuden også dokumenteret på ID3's egen side.
Avatar billede lad Nybegynder
20. august 2008 - 14:36 #14
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 :)
Avatar billede md_craig Nybegynder
20. august 2008 - 17:23 #15
www.dotjem.com/ID3mediatag.doc

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...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester