MP3 Player und ID3 V1 Tag auslesen + sortieren



  • Hallo Zusammen,
    ich habe seit 3 Jahren kein C++ programmiert und habe nun eine neue Herausforderung vor der Brust.
    Ein MP3-Player womit man auch ID3 Tag auslesen kann und anschließend danach sortieren kann.

    Mit meinem Programm, kann man nun schon über die Festplatte browsen und es zeigt die vorhanden MP3 Dateien an.
    Das Abspielen funktioniert mit der C++ Builder Komponente TPlayer.
    http://img249.imageshack.us/img249/3293/prog.jpg

    Nur wie komme ich nun an die ID3 Daten (ID3 V1 reicht mir)?
    Ich habe mir auch die ID3 Lib von ID3.org runtergeladen.
    Komme jedoch nicht weiter.

    Kann mir jemand weiterhelfen? Hat jemand einen Code-Schnippsel der das Auslesen zeigt? Welche header-Datei muss ich von ID3 Lib einbinden?

    Danke Euch
    Gruss Mike



  • Schau mal hier; da sind einige Komponenten geliestest, die das können sollten. Ansonsten halt direkt von Hand aus der Datei auslesen:

    Offset	Länge	Bedeutung
    0	3	Kennung TAG zur Kennzeichnung eines ID3v1-Blocks
    3	30	Songtitel
    33	30	Künstler/Interpret
    63	30	Album
    93	4	Erscheinungsjahr
    97	30	Beliebiger Kommentar
    127	1	Genre
    


  • Ich möchte die Datei mit ifstream einlesen.
    Das öffnen der Datei ist auch nicht das Problem.
    Nur wie kann ich die einzelnen Positionen ansprechen?



  • Hi,

    ein Minimalbeispiel mit TFileStream:

    TFileStream* fstream = new TFileStream( Filename, fmOpenRead);
    
       fstream->Seek( -128, soFromEnd );  // Leseposition 128 Bytes vor Dateiende
    
       // die Tag-Arrays
       char ID3_ID[3];
       char ID3_Title[30];
       char ID3_Interpret[30];
       char ID3_Album[30];
       char ID3_Year[4];
       char ID3_Comment[30];
       char ID3_Genre[1];
    
       // und lesen
       fstream->ReadBuffer( ID3_ID,        3);
       fstream->ReadBuffer( ID3_Title,     30);
       fstream->ReadBuffer( ID3_Interpret, 30);
       fstream->ReadBuffer( ID3_Album,     30);
       fstream->ReadBuffer( ID3_Year,      4);
       fstream->ReadBuffer( ID3_Comment,   30);
       fstream->ReadBuffer( ID3_Genre,     1);
    
       delete fstream;
    

    mit ifstream ists ähnlich.

    mfg
    kpeter



  • Hallo Zusammen,
    erstmal ein Danke an kpeter. Es funktioniert nun 😉
    http://img708.imageshack.us/img708/5683/version03.jpg

    Nun stehe ich vor folgendem Problem:

    Wie bekomme ich Filename dynamisch eingebunden?

    TFileStream* fstream = new TFileStream(Filename, fmOpenRead);
    

    Zur Zeit funktioniert es so:

    TFileStream* fstream = new TFileStream("C:\\demo.mp3", fmOpenRead);
    

    Ich habe eine TDirectoryListBox (Verzeichnisbaum)und eine TListBox implementiert.

    Bei onchange der TListBox lese ich den Dateinamen aus:

    Datei=ListBox1->Items->Strings[ListBox1->ItemIndex];
    

    =demo.mp3

    Den Laufwerksbuchstaben C:\\ lese ich wie folgt aus und bastel ihn mir passend:

    AnsiString laufwerk=Verzeichnisbaum->Drive;
    AnsiString dp=':';
    AnsiString Verzeichnis='\\';
    AnsiString lb=laufwer+dp+Verzeichnis+verzeichnis;
    

    =C:\\

    Aber wie komme ich an das Verzeichnis oder sogar Unterverzeichnis?

    Verzeichnisbaum->GetItemPath(1);
    

    Das bringt mit leider auch nichts, bei einem Unterverzeichnis ist es

    Verzeichnisbaum->GetItemPath(2);
    

    Gibt es da keine bessere Möglichkeit?



  • Da Du ja vermutlich die FileListBox nutzt (oder ist das eine normale ListBox die du füllst?), kannst Du direkt mit FileListBox::FileName auf den Dateinamen inklusive Pfad zugreifen.

    //edit
    Du scheinst Dir das ganze etwas zu kompliziert zu machen (Ermittlung des angeklickten Dateinamens, etc.)
    packe eine DriveComboBox, eine DirectoryListBox und eine FileListBox auf Deine Form und verknüpfe diese miteinander und dann einfach

    TFileStream* fstream = new TFileStream(FileListBox->FileName, fmOpenRead);
    


  • Hallo,

    Du solltest vorhandene MP3-Dateien immer auf v2-Tags prüfen. Diese befinden sich bekanntermassen
    am Dateibeginn. Mit einem Hex-Editor/-betrachter kann man sich gut einen Einblick verschaffen.

    Zum Auslesen von Verzeichnissen gibts doch m.W. im Forum reichlich Stoff... 😉

    mfg kpeter

    ed: Rostfrei war schon da..



  • TFileStream* fstream = new TFileStream(FileListBox->FileName, fmOpenRead);
    

    Bringt mich nicht weiter, dann da steht in Filename -> C:\Verzeichnis\Verzeichnis\dateiname.ext

    Ich benötige c:\\ \\ datei.ext



  • Macht ein kompletter Pfad nicht mehr Sinn um ihn mit dem Stream zu verknüpfen? Kann ich nicht so ganz nachvollziehen.
    Aber egal, schau Dir mal ExtractFileName(), ExtractFileDir(), u.a. an.



  • @Rostfrei[]: Super, danke für die Hilfe. Die Nacht ist zwar kürzer geworden, aber es funktioniert 😃 *Juhu
    Edit: Habe den Button "Tags auslesen" entfernt, macht er nun automatisch beim Anklicken der MP3 Dateien. 👍

    @kpeter: Ja, das ist mein nächster Schritt. Nur habe ich das mit ID3Lib schon probiert und komme da einfach nicht weiter.

    Kann mir jemand bitte einen Weg aufzeigen, wie ich an die V2-Tag komme in C++?



  • Mike2010 schrieb:

    Kann mir jemand bitte einen Weg aufzeigen, wie ich an die V2-Tag komme in C++?

    Zunächst erstmal dieses hier lesen. Und falls du's noch nicht kennst, lohnt ein Blick ins Wikipedia.
    Wenn du weisst, wo welche Tags in der MP3-Datei stehen, kannst du sie auch mit diesem Wissen auslesen.
    Ich denke mal, dieser Weg ist für dich einfacher und verständlicher, als wenn du dich mit der ID3lib beschäftigst.

    Probiers erst mal selbst 🙂

    mfg
    kpeter


Anmelden zum Antworten