Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi m3u Playlist abspielen (https://www.delphipraxis.net/60537-m3u-playlist-abspielen.html)

Nils_13 8. Jan 2006 19:15


m3u Playlist abspielen
 
Hi,

wenn ich eine m3u-Datei in eine ListBox importiere, habe ich alle Lieder so dastehen, wie sie sollen. Aber wenn ich per Doppelklick eines der Lieder abspielen will, geht das nicht. Was muss ich da jetzt tun ?

SirThornberry 8. Jan 2006 19:17

Re: m3u Playlist abspielen
 
wie hast du es denn bisher versucht?

flomei 8. Jan 2006 19:18

Re: m3u Playlist abspielen
 
Erstmal deine Frage vernünftig formulieren... :roll:

Wie hast du dir denn gedacht das du sie abspielen willst?
Zu Fuß, mit nem TMediaPlayer, BASS.dll oder was?

Überanstreng dich nicht beim Fragen formulieren... :roll:

MfG Florian :hi:

edit: Wo sind denn die roten Kästen hin?

Nils_13 9. Jan 2006 13:27

Re: m3u Playlist abspielen
 
Bassdllplayer. 'filename' ist hier das Problem.
Delphi-Quellcode:
procedure prozedur;
var filename: String;
begin
  filename := das aktuelle item der in einer ListBox geladenen m3u-Liste; // das fehlt mir
  bassdllplayer1.Play(filename);
end;

Jelly 9. Jan 2006 13:32

Re: m3u Playlist abspielen
 
Den markierten Eintrag einer Listbox kriegst Du mit
Delphi-Quellcode:
function CurrentListboxEntry (Listbox : TListBox) : string ;
begin
     with listbox do begin
          if itemindex <> -1
          then Result := items[itemindex]
          else Result := '' ;
     end ;
end ;

Daniel G 9. Jan 2006 13:40

Re: m3u Playlist abspielen
 
Oder so:

Delphi-Quellcode:
filename := ListBox1.Items.Strings[Listbox1.ItemIndex];
Wobei ich gestehen muss, dass ich Jellys Funktion hübscher finde....

Jelly 9. Jan 2006 13:46

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Daniel G
Oder so:

Delphi-Quellcode:
filename := ListBox1.Items.Strings[Listbox1.ItemIndex];
Wobei ich gestehen muss, dass ich Jellys Funktion hübscher finde....

Die ist nicht nur hübscher, sondern die liefert Dir auch keine Runtime Error, wenn KEIN Item ausgewählt. In dem Fall liefert itemindex nämlich -1, und Items[-1] spuckt Dir einen Fehler aus.

Ausserdem ist mir neu, mit items.strings[index] auf einen Eintrag zuzugreifen. Ich mach das immer mit items[index] direkt.

alcaeus 9. Jan 2006 13:49

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Jelly
Ausserdem ist mir neu, mit items.strings[index] auf einen Eintrag zuzugreifen. Ich mach das immer mit items[index] direkt.

Beides ist richtig. Items ist ein TString, und dort ist die Strings-Property AFAIR als default markiert ;)

Greetz
alcaeus

Nils_13 9. Jan 2006 13:53

Re: m3u Playlist abspielen
 
Ok, das bringt mich aber nicht ganze weiter, da ich dann ja nur den Namen der Datei habe, aber nicht das Verzeichniss. Ich lade ja eine m3u mit LoadFromFile, jetzt muss mein Programm natürlich noch herausbekommen wo die Datei liegt.

Jelly 9. Jan 2006 13:56

Re: m3u Playlist abspielen
 
Ich dachte du hältst das Verz. gleich mit in der Listbox... Das musst Du halt dann noch sonstwie speichern. Unschön, aber einfach, wäre da z.B. eine TStringList. Du musst dann aber dafür Sorge tragen, dass die Items in der Listbox mit den Items deiner TStringList korrespondieren. imho. ist das Ganze aber eine ziemlich unschöne Lösung.

Nils_13 9. Jan 2006 13:57

Re: m3u Playlist abspielen
 
In der ListBox soll vorallem nur ein Name wie z.B. 03_Breakstuff oder Faint, was weiß ich stehen.

Daniel G 9. Jan 2006 14:00

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Jelly
imho. ist das Ganze aber eine ziemlich unschöne Lösung.

Ich bin mir gerade nicht sicher und kann nicht nachschauen, aber gibt es nicht ähnlich wie bei der TreeView auch bei der Listbox eine Data - Property?

Jelly 9. Jan 2006 14:00

Re: m3u Playlist abspielen
 
Bedenke aber dass in m3u Listen die Verzeichnisangabe nicht zwingend ist. Fehlt dieses, so wird von relativen Pfaden ausgegangen mit dem m3u Listenpfad als Basisverzeichnis.

Jelly 9. Jan 2006 14:02

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Daniel G
gibt es nicht ähnlich wie bei der TreeView auch bei der Listbox eine Data - Property?

Doch, heisst bei TStrings (und nichts anderes ist listbox.items) aber objects. Das wär die saubere Lösung.

Nils_13 9. Jan 2006 14:04

Re: m3u Playlist abspielen
 
Allgemein sauber aber wenn ichs nicht dreimal hintereinander falsch verstanden habe hässlich, was die Playlist betrifft.

[EDIT]Warum wurde Daniel G s Beitrag eben rot markiert, er war doch garnicht neu.[/EDIT]

So sieht eine normale m3u aus:
Delphi-Quellcode:
01_Intro.mp3
02_Just like this.mp3
03_Nookie.mp3
04_Break Stuff.mp3
05_Re-arranged.mp3
06_I'm broke.mp3
07_Nobody like you.mp3
08_Don't go off wandering.mp3
09_9 teen 90 nine.mp3
10_N 2 gether now.mp3
11_Trust.mp3
12_No Sex.mp3
13_Show me what you got.mp3
14_A lesson learned.mp3
15_outro.mp3
Ich weiß langsam wirklich nicht mehr weiter :kotz: Oder muss ich den Ort der playlist ausfindig machen, obwohl bringt auch nichts.

[EDIT]Doch das bringt was, aber wie mach ich das ?

Daniel G 9. Jan 2006 14:12

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Nils_13
[EDIT]Warum wurde Daniel G s Beitrag eben rot markiert, er war doch garnicht neu.[/EDIT]

Ich hatte ihn editiert, habe das editierte aber wieder zurückgenommen.

Zitat:

Zitat von Nils_13
So sieht eine normale m3u aus:
Delphi-Quellcode:
01_Intro.mp3
02_Just like this.mp3
03_Nookie.mp3
04_Break Stuff.mp3
05_Re-arranged.mp3
06_I'm broke.mp3
07_Nobody like you.mp3
08_Don't go off wandering.mp3
09_9 teen 90 nine.mp3
10_N 2 gether now.mp3
11_Trust.mp3
12_No Sex.mp3
13_Show me what you got.mp3
14_A lesson learned.mp3
15_outro.mp3

DAnn musst du in der Tat den Pfad der datei ausfindig machen.

BTW:

Meine WINAMP - M3U sieht so aus [Anfang]:

Delphi-Quellcode:
#EXTM3U
#EXTINF:139,Keb' Mo' - Am I Wrong
L:\Blues & Folk\Keb' Mo'\Just Like You\Am I Wrong.mp3
#EXTINF:227,Keb' Mo' - Angelina
L:\Blues & Folk\Keb' Mo'\Just Like You\Angelina.mp3
#EXTINF:176,Keb' Mo' - Anybody Seen My Girl
L:\Blues & Folk\Keb' Mo'\Just Like You\Anybody Seen My Girl.mp3
#EXTINF:246,Keb' Mo' - City Boy
L:\Blues & Folk\Keb' Mo'\Just Like You\City Boy.mp3
#EXTINF:249,Keb' Mo' - Come Into My Kitchen
L:\Blues & Folk\Keb' Mo'\Just Like You\Come Into My Kitchen.mp3
#EXTINF:188,Keb' Mo' - Dirty Low Down And Bad
L:\Blues & Folk\Keb' Mo'\Just Like You\Dirty Low Down And Bad.mp3
#EXTINF:238,Keb' Mo' - Don't Try To Explain
L:\Blues & Folk\Keb' Mo'\Just Like You\Don't Try To Explain.mp3
#EXTINF:180,Keb' Mo' - Every Morning
L:\Blues & Folk\Keb' Mo'\Just Like You\Every Morning.mp3

Jelly 9. Jan 2006 14:15

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Nils_13
So sieht eine normale m3u aus:

Das ist ne Definitionssache, was Du unter "normal" verstehst... Ich hab welche die sehen so aus (unter Winamp erstellt)
Code:
#EXTM3U
#EXTINF:211,Krezip - What Are You Waiting For
01. Krezip - What Are You Wainting For.mp3
#EXTINF:208,Krezip - Out Of My Bed
02. Krezip - Out Of My Bed.mp3
#EXTINF:227,Krezip - Don't Crush Me
03. Krezip - Don't Crush Me.mp3
#EXTINF:217,Krezip - Brighter Days
04. Krezip - Brighter Days.mp3
#EXTINF:170,Krezip - Really Something
05. Krezip - Really Something.mp3
#EXTINF:210,Krezip - Take Your Time
06. Krezip - Take Your Time.mp3
#EXTINF:186,Krezip - I Apologize
07. Krezip - I Apologize.mp3
#EXTINF:202,Krezip - Where Are You Now
08. Krezip - Where Are You Now.mp3
#EXTINF:210,Krezip - Same Mistake
09. Krezip - Same Mistake.mp3
#EXTINF:195,Krezip - Piece Of Mind
10. Krezip - Piece Of Mind.mp3
#EXTINF:222,Krezip - Same Old Story
11. Krezip - Same Old Story.mp3
#EXTINF:189,Krezip - Don't Want You
12. Krezip - Don´t Want You.mp3
#EXTINF:217,Krezip - Forget What I Said
13. Krezip - Forget What I Said.mp3
:mrgreen: Viel Spass

Zitat:

Zitat von Nils_13
Oder muss ich den Ort der playlist ausfindig machen, obwohl bringt auch nichts.

[EDIT]Doch das bringt was, aber wie mach ich das ?

Na irgendwie lädst Du doch deine Liste, und dazu hast Du doch den vollen Dateinamen mit Dateipfad... Den Pfad alleine ermittelst Du mit der Funktion ExtractFilePath

Nils_13 9. Jan 2006 14:16

Re: m3u Playlist abspielen
 
Hm ...

Dann gibts ein Problem:
1. Muss das Programm zwischen standart und erweiterter Playlist unterscheiden können
2. Muss bei der Standart dann der richtige Pfad ausgelesen werden
3. Wäre es eine Möglichkeit die standartplaylsit in eine erweiterte umzubauen und das irgendwie anzuwenden ?

Delphi-Quellcode:
filename := ExtractFilePath(playlist.Items.Strings[playlist.ItemIndex]);
frmMain.bassdllplayer1.Play(filename);
ShowMessage(FileName);
Hm, dann kommt eine leere Nachricht.

Jelly 9. Jan 2006 14:21

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Nils_13
Delphi-Quellcode:
filename := ExtractFilePath(playlist.Items.Strings[playlist.ItemIndex]);
frmMain.bassdllplayer1.Play(filename);
ShowMessage(FileName);
Hm, dann kommt eine leere Nachricht.

Junge, ich hau mich gleich auf den Kopf.
Wie füllst Du denn deine Listbox wenn nicht durch Öffnen der m3u Datei. Du musst doch wissen wo deine m3u Datei liegt :wiejetzt:
Natürlich liefert ExtractFilePath in Deinem Beispiel nichts da Du ja angeblich in der Listbox die Dateipfade nicht mitspeicherst.

Nils_13 9. Jan 2006 14:26

Re: m3u Playlist abspielen
 
Wie willst du es denn dann machen ? Das größte Problem ist wohl, dass es massig m3u Versionen gibt.

Jelly 9. Jan 2006 14:30

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Nils_13
Wie willst du es denn dann machen ? Das größte Problem ist wohl, dass es massig m3u Versionen gibt.

Massig ist relativ. Informier dich mal über die Standards, die es gibt. Alles andere ist Rumraterei.

Nils_13 9. Jan 2006 14:32

Re: m3u Playlist abspielen
 
Zitat:

Einfache Playliste

Bei der einfachen Playliste kann entweder der volle Dateiname mit absolutem oder relativem Pfad angegeben werden oder eine URL zu einer Datei auf einem Webserver.

Beispiel:

Titel 1.mp3
Pop\Meine Auswahl\Titel 2.mp3
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel 3.mp3
http://www.seite.de/musik/titel4.mp3

In diesem Beispiel ist die Datei Titel 1.mp3 im selben Verzeichnis wie die M3U-Datei, Titel 2.mp3 befindet sich 2 Verzeichnisse unterhalb von der M3U-Datei, für Titel 3.mp3 wurde ein absoluter Pfad angegeben und Titel4.mp3 befindet sich auf einem Webserver.


Erweiterte Playliste

Im Unterschied zur Einfachen Playliste werden in der Erweiterten Playliste zusätzlich Metadaten und ein Header verwendet. Das Format der Erweiterten Playliste ist allerdings aufgrund der Möglichkeit, Metadaten per ID3-Tags direkt in die MP3-Dateien einzubetten, überholt.

Beispiel:

#EXTM3U
#EXTINF:221,Queen - Bohemian Rhapsody
Titel 1.mp3
#EXTINF:473,Dire Straits - Walk Of Life
Pop\Meine Auswahl\Titel 2.mp3
#EXTINF:264,Keep The Faith
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel 3.mp3
#EXTINF:504,Bob Marley - Buffalo Soldier
http://www.seite.de/musik/titel4.mp3

Die erste Zeile #EXTM3U ist der Header und legt das Format der Playliste fest, bei Erweiterten Playlisten ist immer als erste Zeile #EXTM3U zu verwenden. Nach der ersten Zeile folgt der eigentliche Inhalt der Playliste, pro MP3-Datei werden 2 Zeilen benötigt:

* Die 1. Zeile beginnt immer mit #EXTINF:, danach folgt die Länge der MP3-Datei in Sekunden. Nach der Länge wird ein Komma als Trennzeichen verwendet, danach folgt der Name der MP3-Datei, welcher zur Anzeige im Medienspieler dient.
* Die 2. Zeile ist identisch mit der Spezifikation von Einfachen Playlisten, hier wird der volle Dateiname mit absolutem oder relativem Pfad oder eine URL zu einer Datei auf einem Webserver angegeben.

arbu man 9. Jan 2006 16:42

Re: m3u Playlist abspielen
 
Zitat:

Zitat von Nils_13
Ok, das bringt mich aber nicht ganze weiter, da ich dann ja nur den Namen der Datei habe, aber nicht das Verzeichniss. Ich lade ja eine m3u mit LoadFromFile, jetzt muss mein Programm natürlich noch herausbekommen wo die Datei liegt.

Die Listbox mit loadfrom file zu laden ist nicht sehr gut, wie du bei wikipedia gelesen hast gibt es auch noch zeilen mit #. Am besten parset du die m3u datei erst einmal und lädst sie dann in eine liste aus der du die listbox dann 'belädst'. In etwa so:
Delphi-Quellcode:

uses ... Contnrs;

type
  tm3uitem = class(TPersistent)
  private
    fEXTINF: string;
    ffilename: string;
  public
    function getfullfilename: string;
    function getmp3file: string;
  published
    property EXTINF: string read fEXTINF write fEXTINF;
    property FileName: string read ffilename write ffilename;
end;

...

var olist: tobjectlist;

...

{ tm3uitem }

function tm3uitem.getfullfilename: string;
begin
  result:=ExpandFileName(ffilename);
end;

function tm3uitem.getmp3file: string;
begin
  result:=extractfilename(ffilename);
end;

procedure tolistbox(box: tlistbox;olist: tobjectlist);
var
  i:integer;
begin
  for i:=0 to olist.Count-1 do begin
    box.Items.Add((olist[i]as tm3uitem).getmp3file);
  end;
end;

function getfilenamebyindex(i:integer;olist: tobjectlist):string;
begin
  result:= (olist[i]as tm3uitem).getfullfilename;
end;

procedure loadm3u;
var
  slist:tstringlist;
  i:integer;
  item:tm3uitem;
  s,filename:string;
begin
    filename:='deine.m3u';
    olist.Clear;
    SetCurrentDir(FileName); // Damit relative pfad angaben geladen werden können wichtig!!!!
    slist:=tstringlist.Create;
    try
      slist.LoadFromFile(FileName);
      for i:=0 to slist.count-1 do begin
        if trim(slist[i])<>'#EXTM3U' then begin // erste zeile nicht beachten
          s:= slist[i];
          if length(s)>0 then
          if s[1]<>'#' then begin // # Zeilen nicht beachten
            item:=tm3uitem.Create();
            item.filename:=slist[i]; // dateinamen hinzufügen
            if (slist[i-1][1]='#')and(trim(slist[i-1])<>'#EXTM3U') then begin
              item.EXTINF:=slist[i-1]; // idtag info hinzufügen falls vorhanden
            end;
            olist.add(item);
          end;
        end;
      end;
    finally
      slist.Free;
    end;
  end;
end;

Aenogym 9. Jan 2006 17:17

Re: m3u Playlist abspielen
 
Delphi-Quellcode:
sl := TStringList.create();
  try
    sl.loadFromFile(FileName);

    try
      if sl.Count = 0 then
        raise Exception.Create('Die Playlist-Datei ist leer');

      //format checken
      if sl[0] = '#EXTM3U' then
      begin
        { extended m3u playlist }

        //durch alle einträge interieren
        for i:=1 to sl.Count-1 do
        begin
          if copy(sl[i], 1, 8) <> '#EXTINF:' then
            AddSongToPlayList(sl[i]);
        end;
      end
      else
      begin
        { standard m3u playlist }
        for i:=0 to sl.count-1 do
        begin
          AddSongToPlayList(sl[i]);
        end
        else
          raise Exception.Create('Dies ist leider keine unterstützte Playlist-Datei');
      end;
    except
      raise;
    end;
  finally
    sl.free();
  end;
in der prozedur AddSongToPlayList() wird der übergebene dateiname dann geladen. die prozedur behandelt relative und absolute dateinamen, sowie internetstreams, UNC-netzwerkpfade und http-/ftp-pfadangaben.

nur so als denkanstoß...

aeno


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz