Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   notiyu de mediaplayer (ya casi es media prayer) (https://www.clubdelphi.com/foros/showthread.php?t=24930)

Jorghino reyes 06-09-2005 22:56:01

notiyu de mediaplayer (ya casi es media prayer)
 
Hola amigos, tengo un pequeño desde hace varios dias que me trae vuelto loco. resulta que supuestamente con el mediaplayer en el evento on notify nos avisa de los cambios en ejecucion del reproductor. Pero hacendo una pequeña prueba en base a la ayuda de delphi, en el siguiente codigo, NO avisa cuando se detiene "sttoped" ( yo quiero saber el momento en que se acaba la cancion) de hecho vuelve a ponerse en 'playing'

en sus propiedades tengo activado el autoopen y el autoenabled pero no el el autorewind.

y la cancion viene predefinida en sus pripiedades.

manejo 2 botones unicamente uno para play y el otro para stop.

Alguien que me pueda ayudar se lo agradeciria mucho!

pd. de hecho si pones un cd normal se sigue con cada uno de los tracks.

Código Delphi [-]
 procedure TForm1.MediaPlayer1Notify(Sender: TObject);
 const
   ModeStr: array[TMPModes] of string = ('Not ready', 'Stopped',
     'Playing', 'Recording', 'Seeking', 'Paused', 'Open');
 begin
   with Sender as TMediaPlayer do
   begin
     if modestr[Mode] = 'Playing' then begin
     Form1.Caption := ModeStr[Mode];
     edit1.text:= 'Tocando';
     notify:= true;
   end;
   if ModeStr[Mode] = 'Stopped' then begin
     Form1.Caption := ModeStr[Mode];
     edit1.text:= 'detenidoe';
     Notify := True;
   end;
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
   mediaplayer1.open;
   mediaplayer1.play;
 end;
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   mediaplayer1.Notify:= true;
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
   mediaplayer1.Stop;
 end;
 
 end.

dec 07-09-2005 00:18:33

Hola,

Bueno. En el ejemplo que proporciona Delphi sobre el asunto se utilizan cadenas con fines informativos. No sé hasta qué punto no podría hacerse tal como lo intentas, pero, podría ser lo suyo mirar por el valor de la propiedad "Mode" tal que así, por ejemplo:

Código Delphi [-]
   case MediaPlayer.Mode of
     mpOpen: {...} ;
     mpPaused: {...} ;
     mpSeeking: {...} ;
     mpStopped: {...} ;
     mpPlaying: {...} ;
     mpNotReady: {...} ;
     mpRecording: {...} ;
   end;
   MediaPlayer.Notify := true;

jmariano 07-09-2005 00:27:28

Creo que no estás comprendiendo bien el evento "OnNotify" del MediaPlayer. Este evento de notificación se produce cuando es ejecutado un comando MCI para indicar el éxito o fracaso de la operación (el resultado de la operación es almacenado en la propiedad "NotifyValue"). Es decir, cuando ejecutamos un comando MCI (reproducir un archivo o CD, pararlo, etc.) se genera un evento "OnNotify" y el resultado de la operación es almacenado en "NotifyValue" (aunque el componente te da la posibilidad de que no se produzca el evento poniendo la propiedad "Notify" a "False").

MediaPlayer también te devuelve el estado actual de la reproducción a través de la propiedad "Mode", que es la que estás usando en el evento "OnNotify", pero, teniendo en cuenta lo que te expliqué antes, lo que te está devolviendo en realidad, cuando se termina de reproducir el archivo, es que el comando para reproducir se ejecutó con éxito (por eso siempre te muestra "Tocando" y "Playing").

Como lo único que te interesa saber es el "estado" de la reproducción, lo que yo haría es colocar un componente Timer y comprobar, dentro de su evento "OnTimer", el estado de la reproducción a través de la propiedad anterior "Mode" (es decir, la operación del evento "OnNotify" la pasamos al evento "OnTimer"):

Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
const
  ModeStr: array[TMPModes] of string = ('Not ready', 'Stopped',
    'Playing', 'Recording', 'Seeking', 'Paused', 'Open');
begin
  with MediaPlayer1 do
  begin
    if modestr[Mode] = 'Playing' then
    begin
      Form1.Caption := ModeStr[Mode];
      edit1.text:= 'Tocando';
    end;

    if ModeStr[Mode] = 'Stopped' then
    begin
      Form1.Caption := ModeStr[Mode];
      edit1.text:= 'detenido';
    end;
  end;
end;

(Observa que ya no hace falta poner "Notify" a "True" porque no necesitamos que se ejecute el evento "OnNotify")

Para que el Timer no esté permanentemente ejecutándose podemos desactivarlo una vez que concluya la reproducción y volverlo activar cuando se vuelva a reproducir el archivo (a través de la propiedad "Enabled"). Otra cosa a tener en cuenta es que, por defecto, el Timer nos avisará cada segundo del estado de la reproducción, por lo que puede haber un desfase desde que empieza o termina el archivo hasta que nos informa del estado. Para solucionar este desfase podríamos poner la propiedad "Interval" a 100, en vez de a 1000, lo cual da buen resultado (aunque todo es cuestión de probar).

Saludos!

dec 07-09-2005 00:48:37

Hola,

Cita:

Empezado por jmariano
Creo que no estás comprendiendo bien el evento "OnNotify" del MediaPlayer.

Todo pudiera ser... ¡lo raro sería lo contrario! ;)

jmariano 07-09-2005 01:22:02

No me refería a tí dec! jeje! :D

(Es que posteaste justo cuando estaba terminando de mandar el mensaje!)

Saludos!

dec 07-09-2005 11:59:24

Hola,

No; si sé que no te referías a mí, directamente, pero, podrías haberlo hecho, perfectamente, porque del uso del "TMediaPlayer" no es que sepa demasiado que digamos... si ya lo he dicho antes, ¿qué sé yo? ;)

Jorghino reyes 08-09-2005 17:31:28

Correcto, lo voy a intentar. gracias por su tiempo a ambos!

Jorghino reyes 08-09-2005 18:19:02

Excelente, funciona tal cual como lo mensionaron, justo lo que requeria.:)

No cabe duda de que el que sabe... sabe!:eek:

pero ahora, abusando de sus conocimientos:

Existe relacion entre la propiedad 'length' y 'position' del media player, supongo que ya saben lo que lo estoy buscando.

conocer el tiempo de duracion de la cancion y referenciar su avance aun etiqueta que me muestre el timpo que resta o que lleva reproduciendo. asi como una track bar.

Se me ha ocurrido hacerlo externamente mientras investigo lo de length y position hacerlo asi:

cuando inicie la reproduccion capturar el "tiempo" (minutos y segundos) actual en una variable, y con un otro timer en cada segundo, la hora actual compararla con la variable que contiene la tiempo de inicio. esto hasta que termine la cancion en reproduccion. Pero asi solo podria obtener el tiempo que transcurre.

Por ello quiero saber como funciona la propiedad length, son milesimas de segundos lo que muestra? tendria que crear un funcion que las convirtiera a minutos? que me sugieren ?


Gracias de antemano.

dec 08-09-2005 18:30:54

Hola,

Mira en la ayuda de Delphi la descripción de las propiedades "Length", "Position" y "TimeFormat".


La franja horaria es GMT +2. Ahora son las 21:50:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi