PDA

Ver la Versión Completa : Reproducir audio en archivo de recursos con TMediaPlayer


sbraceras
16-06-2012, 01:04:44
Hola! Les comento lo que estoy queriendo hacer y agradecería me confirmen si es la mejor alternativa que existe :)
Yo tengo archivos de audio (mp3, midi, wav, wma) 'metidos' en el ejecutable usando un archivo de recursos, ya que no quiero cargarlos desde disco porque no quiero que exista la posibilidad de que manipulen esos archivos. Lo que quiero es poder reproducirlos en mi aplicación.

Estuve investigando y una forma muy fácil es usar la función PlaySound de la API de Windows o bien sndPlaySound, pero según pude notar, sólo reproduce wavs! Esto es así?
Entonces como yo quiero reproducir cualquier formato usé el TMediaPlayer que viene en la paleta de componentes y la verdad que reproduce todos los formatos, pero el problema está en que con el TMediaPlayer no puedo cargarle los archivos embebidos en el exe directamente, sino que debo indicar en la property FileName el nombre de archivo que quiero reproducir. En cambio con PlaySound lo logro de una manera muy fácil.
Entonces no me queda otra alternativa que extraer los archivos de audio de mi ejecutable y copiarlos a disco y luego indicar en la property FileName el archivo que quiero reproducir. ¿Estoy haciendo lo mejor que se podría hacer?
Esa es mi inquietud. Muchas gracias de antemano!

ecfisa
16-06-2012, 07:10:22
Hola sbraceras y bienvenido a Club Delphi :)

Una opción es usar la función mciSendString (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757161(v=vs.85).aspx).

Ejemplo:

...
implementation

{$R *.dfm} {$R Recurso.res}

uses MMSystem;

procedure TForm1.FormCreate(Sender: TObject);
var
RStream: TResourceStream;
PathAndFile: string;
begin
PathAndFile:= ExtractFilePath(Application.ExeName) + 'sound.mp3';
RStream := TResourceStream.Create(HINSTANCE, 'sound', RT_RCDATA);
try
RStream.SaveToFile(PathAndFile);
mciSendString('close media', nil,0, 0);
mciSendString(PChar('open "' + PathAndFile + '" alias media'), nil, 0, 0);
mciSendString('play media', nil, 0, 0);
finally
RStream.Free;
DeleteFile(PathAndFile);
end;
end;
...


Saludos.

sbraceras
18-06-2012, 19:03:35
Muchas gracias ecfisa por tu respuesta!

Supongo entonces que no hay otra alternativa para reproducir cualquier tipo de archivo de audio directamente desde los recursos del ejecutable, hay que grabarlos en disco si o si. Eso quería saber.
Por último, si uso esa función de la API (mciSendString) no puedo detectar cuando ha finalizado el sonido? Necesito sí o sí detectar cuando finalizó un sonido para ejecutar un nuevo sonido a continuación (es para guiar al usuario en el uso del sistema mediante audios de ayuda). Quiero ejecutar un audio que dice 'Bienvenido!' y seguido a este, otro audio que dice 'Por favor, presente el ticket en el lector' y así... y los audios pueden venir en diferente formato, pero son todos mp3 o son todos wma o son todos wav).

Por qué recomendaste usar esa función de la API en vez del TMediaPlayer?

Mil gracias de nuevo por tu ayuda!

Saludos!

ecfisa
18-06-2012, 19:51:09
Por qué recomendaste usar esa función de la API en vez del TMediaPlayer?

Hola sbraceras.

En realidad no fué una recomendación sino presentarte una alternativa al uso de TMediaPlayer, pero en ningún caso con la intención de desmerecer el uso de este último.

Un saludo. :)

sbraceras
18-06-2012, 21:49:27
Bueno, muy amable ecfisa!

Respecto a esta pregunta me puedes ayudar por favor? si uso esa función de la API (mciSendString) no puedo detectar cuando ha finalizado el sonido? Necesito sí o sí detectar cuando finalizó un sonido para ejecutar un nuevo sonido a continuación. Se entiende?

ecfisa
18-06-2012, 22:18:52
Hola.

Creo que te puede servir el flag Wait (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757622(v=vs.85).aspx).

Ejemplo:

...
mciSendString('play media wait', nil, 0, 0);
ShowMessage('Finalizado');
...


Saludos.

sbraceras
18-06-2012, 22:21:42
Muchas gracias!