Cómo jugar múltiples archivos.wav simultáneamente en delphi
audio media-player (5)
Deseo varios archivos .wav simultáneamente en Delphi.
Cuando abro y plat las primeras cosas están bien. Sin embargo, el segundo causa un error cuando intenta abrir.
Parece que solo puedo usar un reproductor multimedia a la vez ... ¿hay alguna forma de evitarlo? ¿Qué hago?
Puede usar SoX (Sound eXchange) para esto. Puede reproducir y grabar archivos de audio, aplicar diversos efectos, convertir varios formatos ....
Verifique el parámetro -m para reproducir archivos simultáneamente. Ejemplo:
sox -m 1.wav 2.wav -d
Puede usar el filtro de transformación DirectShow. Es una interfaz de programación de aplicaciones (API) de Microsoft Windows que permite que las aplicaciones de Windows interactúen y controlen los dispositivos de entrada de Windows Media.
O puede usar WaveMix DLL , es una utilidad que permite que se reproduzcan varios archivos WAV simultáneamente. Está diseñado para ser tan simple de usar como sea posible, pero aún así tener el poder de hacer lo que requieren los juegos. La DLL admite 8 canales de reproducción de onda simultánea, la capacidad de poner en cola las ondas a lo largo del mismo canal y la notificación de finalización de la onda.
Lo hice haciendo algo como esto:
//yup, i used more than 1 MediaPlayer controls.
MediaPlayer1.FileName:=''song1.wav'';
MediaPlayer2.FileName:=''song2.wav'';
MediaPlayer1.Open;
MediaPlayer2.Open;
MediaPlayer1.Play;
MediaPlayer2.Play;
//the next lines of code is checked every so often in my Timer event handler.
if MediaPlayer1.Position=MediaPlayer1.Length then begin
MediaPlayer1.Close;
end;
if MediaPlayer2.Position=MediaPlayer2.Length then begin
MediaPlayer2.Close;
end;
creo que podemos usar
sndPlaySound(''filename1.wav'',SND_SYN OR SND_NODEFAULT);
sndPlaySound(''filename2.wav'',SND_SYN OR SND_NODEFAULT);
sndPlaySound(''filename3.wav'',SND_SYN OR SND_NODEFAULT);
sndPlaySound(''filename4.wav'',SND_SYN OR SND_NODEFAULT);
¿Cómo tocarías un solo sonido? Cuando quiero un control preciso, uso las funciones waveOut
, como en esta respuesta . Mi respuesta allí también te permite reproducir el sonido con un hilo (es decir, entre otras cosas, de forma asincrónica). Creo que puedes tocar dos sonidos al mismo tiempo, simplemente iniciando dos de esos hilos al mismo tiempo, si solo reemplazas var
global con s de threadvar
global.
Actualizar
La forma más sencilla de reproducir un solo sonido es usar PlaySound
. Esto se puede usar de forma asincrónica, pero como hace esta pregunta, supongo que esto no le permite usar esta función dos veces seguidas para iniciar la reproducción simultánea de dos archivos. Pero: si crea un hilo que solo reproduce el sonido ( sincrónicamente para que el hilo no muera antes de que termine la reproducción), entonces probablemente pueda usar dos de estos hilos para reproducir dos archivos de audio simultáneamente. (No tengo acceso a un compilador Delphi en este momento, así que me temo que no puedo probar mis hipótesis).
Actualización 2
Mi hipótesis era que podía usar dos llamadas a PlaySound
si solo se llamaba a la función desde dos hilos diferentes , pero aparentemente eso no es lo suficientemente bueno. Realmente necesitas dos procesos diferentes, parece, que es malo (para decir lo obvio). Lo intenté
procedure TForm1.FormCreate(Sender: TObject);
begin
with TSoundPlayerThread.Create(true) do
begin
SetFileName(''C:/Users/Andreas Rejbrand/Downloads/Anna.wav'');
FreeOnTerminate := true;
Resume;
end;
with TSoundPlayerThread.Create(true) do
begin
SetFileName(''C:/Users/Andreas Rejbrand/Downloads/Mike.wav'');
FreeOnTerminate := true;
Resume;
end;
end;
con
unit SoundPlayerThread;
interface
uses
Classes, MMSystem, Windows;
type
TSoundPlayerThread = class(TThread)
private
{ Private declarations }
FAudioFileName: string;
protected
procedure Execute; override;
public
procedure SetFileName(const FileName: string);
end;
implementation
procedure TSoundPlayerThread.Execute;
begin
PlaySound(PChar(FAudioFileName), 0, SND_SYNC);
end;
procedure TSoundPlayerThread.SetFileName(const FileName: string);
begin
FAudioFileName := FileName;
end;
end.
y solo el último archivo de onda fue reproducido.
Actualización 3
De hecho, he escrito una pequeña biblioteca de archivos WAV. Usando esto, puedo cargar dos archivos WAV, fusionarlos y enviar el resultado al controlador de audio. Sin embargo, es demasiado código para publicar aquí. Si algún día me queda tiempo, podría escribir un procedimiento PlaySimultaneously
más liviano y publicarlo.
De lo contrario: DirectX?