Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi mp3 starten, stoppen und Ende erkennen (https://www.delphipraxis.net/79848-mp3-starten-stoppen-und-ende-erkennen.html)

papabaer 29. Okt 2006 20:57


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:
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;
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.

Hador 29. Okt 2006 21:31

Re: mp3 starten, stoppen und Ende erkennen
 
Ich habe mal in meinen alten Player reingeschaut.
Dort habe ich statt
Delphi-Quellcode:
  with Sender as TMediaPlayer do
  begin
    case Mode of
      mpStopped: begin
                   MediaForm.Hide;
                   MPlayer.Close;
                 end;
    end;
  end;
sinngemäß folgendes verwendet:

Delphi-Quellcode:
if (MPlayer.Position >= MPlayer.Length) then
begin
  MediaForm.Hide;
  MPlayer.Close;
end;

papabaer 29. Okt 2006 21:45

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?

EWeiss 29. Okt 2006 23:58

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ß

Hador 30. Okt 2006 00:31

Re: mp3 starten, stoppen und Ende erkennen
 
Zitat:

Zitat von papabaer
Ich vermute, dann hast du aber einen Timer verwendet, der regelmäßig die Position abfragt. Hat dies keine Auswirkungen auf die Performance?

Ganz falsch vermutet.
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:

Zitat von EWeiss
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ß

Afaik wird TMEdiaPlayer.Mode auf mpStopped gesetzt, wenn man die Prozedur TMediaplayer.Stop ausführt.
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.

EWeiss 30. Okt 2006 00:58

Re: mp3 starten, stoppen und Ende erkennen
 
Zitat:

Afaik wird TMEdiaPlayer.Mode auf mpStopped gesetzt, wenn man die Prozedur TMediaplayer.Stop ausführt.
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.
Ja ;)
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ß

papabaer 30. Okt 2006 11:54

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:
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;
Das MPlayer.Close musste ich zweimal entfernen, da es jeweils einen MCI-Error produziert hat. Aber so wie oben funktioniert es. Danke.

Hador 30. Okt 2006 15:32

Re: mp3 starten, stoppen und Ende erkennen
 
Zitat:

Zitat von papabaer
Delphi-Quellcode:
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;

Wiso schreibst du eigentlich with Sender as TMediaPlayer do... wenn du letztlich doch per MPlayer... auf deine Instanz vom Mediaplayer zugreifst?
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:
procedure TMediaForm.NotifyProc(Sender: TObject);
begin
  if MPLayer.Position= MPlayer.Length then
  begin
    MediaForm.Close;
    MainForm.Enabled := True;
  end;
end;
Wegen MainForm.Enabled := True; :
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

papabaer 30. Okt 2006 16:27

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.

Hador 30. Okt 2006 16:51

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