Mein einfacher Mp3-Player
Playlisten laden und speichern
Playlist-Formate gibt es ungefähr genauso viele wie Player. Ein recht einfaches und noch dazu sehr verbreitetes ist m3u, das u.a. von Winamp gerne verwendet wird. Wir erweitern jetzt unsere Playlistklasse um Lade- und Speicherroutinen für solche Dateien.
TMeMPPlaylist = Class(TMeMPPlayer) private procedure LoadFromM3U(aFilename: String); procedure SaveAsM3U(aFilename: String); public procedure LoadFromFile(aFilename: String); procedure SaveToFile(aFilename: String); end;
Das Vorgehen ist hier ähnlich wie ganz am Anfang bei der Audioklasse. Wir haben eine öffentliche Methode, die je nach Dateiendung die richtige Untermethode aufruft. Wer mag, kann später Methoden zum Laden und Speichern anderer Formate hinzufügen. Für Webradio ist das pls-Format noch interessant, was im Wesentlichen eine Ini-Datei ist.
procedure TMeMPPlaylist.LoadFromFile(aFilename: String); begin if LowerCase(ExtractFileExt(aFilename)) = '.m3u' then LoadFromM3U(aFilename); end; procedure TMeMPPlaylist.SaveToFile(aFilename: String); begin if LowerCase(ExtractFileExt(aFilename)) = '.m3u' then SaveAsM3U(aFilename); end;
M3U-Listen kann man z.B. wie folgt laden und für unsere Zwecke verarbeiten. Da wir sowieso die Dateien untersuchen, ignorieren wir die oft vorhandenen ExtInf-Daten – die müssten wir sonst mit pos und copy auseinanderfriemeln, was ich mir an dieser Stelle sparen möchte.
procedure TMeMPPlaylist.LoadFromM3U(aFilename: String); var mylist: TStringlist; i: Integer; s: String; begin mylist := TStringlist.Create; mylist.LoadFromFile(aFilename); if (myList.Count > 0) then begin if (myList[0] = '#EXTM3U') then //Liste ist im EXT-Format begin i := 1; while (i < myList.Count) do begin // Zuerst kommen ggf. die ExtInf-Daten s := myList[i]; if trim(s) = '' then inc(i) else begin if (copy(s,0,7) = '#EXTINF') then // ExtInf-Zeile auslassen inc(i); Add(ExpandFilename(myList[i])); inc(i); end; end; end else // Liste ist nicht im EXT-Format - einfach nur Dateinamen for i := 0 to myList.Count - 1 do begin if trim(mylist[i])='' then continue; Add(ExpandFilename(myList[i])); end; end; FreeAndNil(myList); end;
Beim Speichern müssen wir weniger Fehler abfangen, daher geht das kürzer:
procedure TMeMPPlaylist.SaveAsM3U(aFilename: String); var myList: tStringlist; i:integer; aAudiofile: TAudioFile; begin myList := TStringList.Create; myList.Add('#EXTM3U'); for i := 0 to fPlayList.Count - 1 do begin aAudiofile := fPlaylist[i] as TAudioFile; myList.add('#EXTINF:' + IntTostr(aAudiofile.Dauer) + ',' + aAudioFile.Interpret + ' - ' + aAudioFile.Titel); myList.Add(ExtractRelativePath(aFilename, aAudioFile.Pfad )); end; myList.SaveToFile(afilename); FreeAndNil(myList); end;
Wie wir das in unseren Player einbauen, ist hoffentlich klar. Auf die Form einfach noch zwei weiterere Buttons, einen OpenDialog und einen SaveDialog draufpacken und im OnClick-Event der beiden Buttons nach dem Execute des Dialogs die Liste laden oder speichern.
2 Gedanken zu „Mein einfacher Mp3-Player“
Kommentare sind geschlossen.
Ist es mit Delphi auch möglich von einer mp3-Aufname über Start- und Stop-Zeit-Parameter nur einen Ausschnitt abzuspielen? Ich suche für eine blinde Person die Möglichkeit sich Audioaufnahmen ab einem bestimmten Abschnitt vorlesen zu lassen. Vielen Dank für die geschätzte Antwort.
Generell sollte dies möglich sein.
Am Besten dazu einmal einen Thread im Forum aufmachen, da tummeln sich einige Leute, die schon mit MP3s gearbeitet haben.
Gruß
Thomas