Delphi-PRAXiS

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.

Cyberaxx 3. Jan 2007 20:27

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Du wirst bei der Bass.Dll aber so nie um einen Timer rum kommen, denn soweit ich weiss gibt es ja kein Event das anspringt, wenn ein Track zu Ende ist. Wäre schon sehr schön wenn das der Fall wäre aber ist es ja soweit ich weiss bisher eben nicht.

Wenn man feststellt der Track ist jetzt am Ende lässt man einfach den Timer deaktivieren arbeitet sein Event ab und startet den Timer danach erneut mit dem nächsten Lied.

Oder anders man deaktiviert einfach gewisse Funktionen und lässt sie eine Sekunde später anlaufen.

Noch eine Möglichkeit wäre, man rechnet einfach eine Sekunde drauf und man ist damit definitiv auf der sicheren Seite.

Das der Timer nie so genau ist, da er Last abhängig ist aber das sollte denk ich hierbei im Sekundenbereich vernachlässigbar sein.

Es gibt also denk ich genug Möglochkeiten aber um ehrlich zu sein hab ich mir da nie damals Gedanken drüber gemacht.

Gausi 3. Jan 2007 20:44

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Ich bin ja bis jetzt ruhig geblieben, weil ich die Lösung mit einem Timer bisher auch noch verwende und sie ja auch gut funktioniert. Aber das jetzt behauptet wird, dass es keine andere Lösung gibt, obwohl ich bereits ganz am Anfang den entsprechenden Hinweis genannt habe, finde ich dann doch etwas merkwürdig. Über BASS_SYNC_END findet man in der Bass-Hilfe die wundervolle Funktion BASS_ChannelSetSync, mit deren Hilfe man eine Prozedur angeben kann, die ausgeführt wird, wenn das Lied am Ende ist, oder eine bestimmte Position erreicht, oder in einem Stream neue Meta-Tags gefunden werden und einiges mehr. Ganz ohne Timer. :roll:

Cyberaxx 3. Jan 2007 21:03

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Sry das hab ich wohl nicht aufmerksam genug gelesen.

Ging jetzt auch nicht gegen Dich, sondern eher um den Nutzen eines Timers

Gausi 3. Jan 2007 21:29

Re: bass.dll, wie möglichst schnell Ende einer Mp3 mitbekomm
 
Macht ja auch nix :D.

Bei den meisten Playern läuft eh ein Timer im Hintergrund zur Visualisierung und Setzen der Positionsangabe, und eine Abfrage mehr oder weniger in der Timer-Routine macht in der Regel kaum was aus, da das Zeichnen wohl am rechenaufwendigsten ist. Aber das mit dem Ende geht auch ohne.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 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