Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bass.dll, wie möglichst schnell Ende einer Mp3 mitbekommen? (https://www.delphipraxis.net/83492-bass-dll-wie-moeglichst-schnell-ende-einer-mp3-mitbekommen.html)

Dash 3. Jan 2007 16:31


bass.dll, wie möglichst schnell Ende einer Mp3 mitbekommen?
 
Hi,

ich experementiere gerade ein wenig mit der bass.dll rum, nur komme ich bei einer Sache nicht so ganz weiter.
Und zwar möchte ich das man eine Playlist zusammenstellen kann, nur wie kann ich jetzt sofort mitbekommen, dass die letzte Mp3 zu ende ist um die nächste abzuspielen?

Bei den Demos liegt dafür kein Beispiel bei!

Gruß
Dash

Gausi 3. Jan 2007 16:42

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Such mal in der Bass-Dokumentation nach BASS_SYNC_END. Das sollte dir weiterhelfen.

Anthauri 3. Jan 2007 16:59

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Ein ähnliches Problem hatte ich in meinem Player auch.

Dort läuft ein Timer, der unter anderem die Spielzeit des Songs darstellt.
Den nutze ich auch für die Abfrage, ob die aktuelle Position des Songs der Gesamtlänge entspricht.
Trifft das zu, muß der Song am Ende sein.

Nils_13 3. Jan 2007 17:03

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Ich muss zugeben, dass ich ein wenig eingerostet bin, aber gab es da nicht mal so etwas, wie BASS_CHANNEL_GETLENGTH ?
Deshalb immer die Finger von Timern lassen, wenn es eben geht. Ist nicht gut, wenn der durchläuft.
Such dir raus, was du brauchst, diese Zeile gibt dir die Zeit an.
Delphi-Quellcode:
Round(BASS_ChannelBytes2Seconds(Chan, BASS_ChannelGetLength(chan)));

Anthauri 3. Jan 2007 17:20

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
@Nils_13

Liefert die von Dir genannte Funktion nicht das was sowieso schon in der "Player.Position" steht?

Und was das schlimme an Timern ist habe ich auch nicht ganz verstanden?
Was ist denn die Alternative zu einer solchen Zeitanzeige, die zyklisch aktualisiert wird?

Dash 3. Jan 2007 17:24

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Also ich werde das jetzt erstmal mit nen Timer und
Delphi-Quellcode:
Round(BASS_ChannelBytes2Seconds(Chan, BASS_ChannelGetLength(chan)));
und
Delphi-Quellcode:
Round(BASS_ChannelBytes2Seconds(Chan, BASS_ChannelGetPosition(chan)));
versuchen :wink:
Danke erstmal :-D

Gruß
Dash

Cyberaxx 3. Jan 2007 17:35

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Da in den meisten Playern nen Timer Läuft, zum anzeigen der Zeit würd ich mal behaupten, so eignet sich hier nen Timer wohl hervoragend.

Ich habs damals bei mir auch per Timer gemacht...
Mein Source ist aber recht alt also nicht wundern.

Delphi-Quellcode:
var
  playtime : float;
  songpos : int64;
  titellaenge : float;
  songlength : int64;

songlength := BASS_streamgetlength(chan);
Titellaenge := BASS_channelbytes2seconds(chan, songlength);
songpos := BASS_channelgetposition(chan);
playtime := BASS_channelbytes2seconds(chan, songpos);

if iniTimerender = 0 then
  begin
  label_timer.Caption := formatdatetime('hh:nn:ss', (titellaenge - playtime) / (24 * 60 * 60));
  image_remain.Visible := true;
  end;

if iniTimerender = 1 then
  begin
  label_timer.Caption := formatdatetime('hh:nn:ss', playtime / (24 * 60 * 60));
  image_remain.Visible := false;
  end;
  if songlength - songpos = 0 then spielmodus := 'next';
Spielmodus := 'next'; lädt den nächsten Track, da die Zeit ja bei 0 ist also Track Ende...

Nils_13 3. Jan 2007 18:02

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Hm, dann habe ich da was verwechselt. Dieser Code liefert mir die Gesamtlänge, um die es meiner Interpretierung nach, hier geht.
Delphi-Quellcode:
function TfrmMain.DurationMinSec(Sekunden : String) : String;
var Min, Sec : integer;
    SecToTime : string;
begin
   Min:=  StrToInt(Sekunden) div 60;
   Sec:=  StrToInt(Sekunden) - Min * 60;
   SecToTime:= Trim(Format('%2d:%.2d', [Min, Sec]));
   result:= SecToTime;
end;

[...]

DurationMinSec(IntToStr(fFiles[playindex].Dauer))
Die Dauer lese ich dem Anschein nach aus den Tags aus.

Anthauri 3. Jan 2007 18:24

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Wie dem auch sei,

auf jeden Fall hat die Sache mit dem Timer auch einen Haken.

Bei meinem Player hatte ich einst den TMEDIAPLAYER benutzt, der netter weise Millisekunden liefert.
Den passenden Timer hatte ich ebenfalls in Millisekunden laufen.

Nachdem ich den BassdllPlayer nutze stehen nur noch Sekunden zur verfügung.
Der Timer läuft jetzt auch im Sekundentakt.

Bei exaktem hinschauen resultiert dadurch, dass ggf. vom Song ein Teil der letzten Sekunde fehlt,
denn die Abfrage, ob die Position im Song gleich der Songlänge entspricht, trifft ja zu sobald die letzte Sekunde angebrochen ist - und wenn der Timer gerade zufällig so zyklisch getaktet ist, dass er einen kurzen Moment nach Beginn der letzen Sekunde auslöst, wird der nächtse Song aufgerufen und der Rest nicht gespielt.

Da aber die meisten Songs am Ende eh ausklingen fällt das nicht so sehr auf.
Bei Titeln, die ineinander übergehen manchmal aber schon.
Beim TMEDIAPLAYER fehlte aufgrund der schnelleren Taktung weniger.

Da aber auch andere hier ähnlich verfahren dürfte diese Aufgabe "hinreichend genau gelöst sein".
Den alten TMEDIAPLAYER würde ich deswegen nicht wieder implementieren.

Nils_13 3. Jan 2007 18:57

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Man könnte ja Sekunden noch mit einem Milli-Sekunden Timer realisieren, dann müsste es funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.
Seite 1 von 2  1 2      

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