AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi mp3 starten, stoppen und Ende erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

mp3 starten, stoppen und Ende erkennen

Ein Thema von papabaer · begonnen am 29. Okt 2006 · letzter Beitrag vom 30. Okt 2006
Antwort Antwort
papabaer

Registriert seit: 24. Okt 2006
11 Beiträge
 
#1

mp3 starten, stoppen und Ende erkennen

  Alt 29. Okt 2006, 20:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: mp3 starten, stoppen und Ende erkennen

  Alt 29. Okt 2006, 21:31
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;
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
papabaer

Registriert seit: 24. Okt 2006
11 Beiträge
 
#3

Re: mp3 starten, stoppen und Ende erkennen

  Alt 29. Okt 2006, 21:45
Ich vermute, dann hast du aber einen Timer verwendet, der regelmäßig die Position abfragt. Hat dies keine Auswirkungen auf die Performance?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: mp3 starten, stoppen und Ende erkennen

  Alt 29. Okt 2006, 23:58
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 00:31
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 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.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 00:58
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ß
  Mit Zitat antworten Zitat
papabaer

Registriert seit: 24. Okt 2006
11 Beiträge
 
#7

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 11:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 15:32
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
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
papabaer

Registriert seit: 24. Okt 2006
11 Beiträge
 
#9

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 16:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: mp3 starten, stoppen und Ende erkennen

  Alt 30. Okt 2006, 16:51
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;
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 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