![]() |
mp3 starten, stoppen und Ende erkennen
Ich möchte in einem Programm einzelne mp3-Files abspielen. Dies soll in einer extra Form passieren. Die Form soll wieder geschlossen werden, wenn ein Button "Stop" gedrückt wurde oder die Datei vollständig abgespielt wurde ... und genau dort habe ich ein Problem. Er tut es einfach nicht ... und ich hab keine Ahnung weshalb. Vielleicht hat einer eine Idee?
Delphi-Quellcode:
Ursprünglich wollte ich den TMediaPlayer umgehen und direkt mit MCISendString(PChar('play ' + s + ' notify'), nil, 0, Handle); und MCISendString(PChar('stop ' + s), nil, 0, 0); die Sounds abspielen, aber ich bin mit dem Hnadle nicht zurechtgeommen. Ich denke aber, das das eigentliche Problem bei beiden Varianten das gleiche sein dürfte.
procedure TMediaForm.FormCreate(Sender: TObject);
begin MPlayer.Notify:= True; MPlayer.OnNotify:= NotifyProc; end; procedure TMediaForm.FormShow(Sender: TObject); begin MPlayer.FileName:= 'd:\applause.wav'; MPlayer.Open; MPlayer.Play; end; procedure TMediaForm.NotifyProc(Sender: TObject); begin with Sender as TMediaPlayer do begin case Mode of mpStopped: begin MediaForm.Hide; MPlayer.Close; end; end; Notify := True; end; end; procedure TMediaForm.BtnStopClick(Sender: TObject); begin MPlayer.Stop; MPlayer.Close; Close; end; |
Re: mp3 starten, stoppen und Ende erkennen
Ich habe mal in meinen alten Player reingeschaut.
Dort habe ich statt
Delphi-Quellcode:
sinngemäß folgendes verwendet:
with Sender as TMediaPlayer do
begin case Mode of mpStopped: begin MediaForm.Hide; MPlayer.Close; end; end; end;
Delphi-Quellcode:
if (MPlayer.Position >= MPlayer.Length) then
begin MediaForm.Hide; MPlayer.Close; end; |
Re: mp3 starten, stoppen und Ende erkennen
Ich vermute, dann hast du aber einen Timer verwendet, der regelmäßig die Position abfragt. Hat dies keine Auswirkungen auf die Performance?
|
Re: mp3 starten, stoppen und Ende erkennen
mpStopped wird wenn überhaupt nur ausgelößt wenn der Song zu ende ist oder ?
Also benötigst du in einem Timer die abfrage (MPlayer.Position >= MPlayer.Length) wenn die bedingung erfüllt ist .. erst dann ist mpStopped = True Ist mpStopped keine Message dann mußt du den mode erst zuweisen. if (MPlayer.Position >= MPlayer.Length) then mpStopped = True gruß |
Re: mp3 starten, stoppen und Ende erkennen
Zitat:
Denn der Mediaplayer führt das Notify-Event aus wenn ein Lied zu ende ist (unter anderem). So muss man nur abfragen, ob das Lied wirklich zu ende ist, oder ein anderes Ereignis geschehen ist (bspw. Player gestoppt). Daher braucht man keinen Timer (obwohl es damit auch geht) sondern muss den Code lediglich in's Notify-Ereignis schreiben. Zitat:
Manuell setzen braucht man es nicht. Und dann könnte man genausogut das Fenster durch den Timer schließen lassen. Aber ich habe oben ja schon eine andere Möglichkeit genannt. |
Re: mp3 starten, stoppen und Ende erkennen
Zitat:
Ich bin davon ausgegangen das mpStopped ein Event ist welches ausgelößt wird wenn (MPlayer.Position >= MPlayer.Length) bedingung erfüllt ist. Warum ich das angenommen habe ist die NotifyProc welche doch einer Callback gleich kommt! Anstatt 'Case of' deine IF abfrage! Das war's dann ;) Gruß |
Re: mp3 starten, stoppen und Ende erkennen
Also mit dem Abtesten von Position und Länge klappt es gut, wobei ich mir immer noch nicht erklären kann, weshalb mbStopped nicht funktioniert. Macht - aus meiner Sicht - ja das Gleiche. Also nur der Vollständigkeit halber:
Delphi-Quellcode:
Das MPlayer.Close musste ich zweimal entfernen, da es jeweils einen MCI-Error produziert hat. Aber so wie oben funktioniert es. Danke.
procedure TMediaForm.FormCreate(Sender: TObject);
begin MPlayer.Notify:= True; MPlayer.OnNotify:= NotifyProc; end; procedure TMediaForm.FormShow(Sender: TObject); begin MPlayer.FileName:= 'd:\applause.wav'; MPlayer.Open; MPlayer.Play; end; procedure TMediaForm.NotifyProc(Sender: TObject); begin with Sender as TMediaPlayer do begin if MPLayer.Position= MPlayer.Length then begin MediaForm.Close; MainForm.Enabled:= true; end; Notify:= True; end; Notify := True; end; end; procedure TMediaForm.BtnStopClick(Sender: TObject); begin MPlayer.Stop; Close; end; |
Re: mp3 starten, stoppen und Ende erkennen
Zitat:
Auserdem setzt du jedesmal zweimal Notify auf True, was völlig unnötig ist, da du es nur einmal nach dem erschaffen des Players machen musst. Also:
Delphi-Quellcode:
Wegen MainForm.Enabled := True; :
procedure TMediaForm.NotifyProc(Sender: TObject);
begin if MPLayer.Position= MPlayer.Length then begin MediaForm.Close; MainForm.Enabled := True; end; end; Ich denke du deaktivierst dein Hauptformular, wenn du das mit dem Player aufrufst. Ruf das Formular doch einfach modal auf (MediaForm.ShowModal;). Dann ist dein Hauptformular ohnehin solange deaktiviert wie das Playerformular geöffnet ist und du ersparst dir das manuelle deaktivieren. Gruß Lars |
Re: mp3 starten, stoppen und Ende erkennen
Ups, die Zeilen mit dem Notify:= true war nur ein Kopierfehler ...
Aber, ich denke Notify wird bei jedem Aufruf automatisch auf false gesetzt - deshalb muss ich es immer wieder auf true setzen. Danke für den Tipp mit dem Showmodal ... hätt ich auch selbst drauf kommen können. |
Re: mp3 starten, stoppen und Ende erkennen
Nö eigentlich nicht.
Ich setzedas in meinem Player auch nur bei Programmstart einmal auf True und dann nie wieder. Und: Es funktioniert! So sieht mein Notify-Ereignis aus:
Delphi-Quellcode:
procedure TPartyPlayer.PlayerNotify(Sender: TObject);
begin if (Player.Position >= Player.Length) and (Playlist.Items.Count >= 1) then if playing_nr < Playlist.Items.Count-1 then PlayMusic(Succ(playing_nr)) else PlayMusic(0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz