reproducir - como poner sonido en java eclipse
Captura de sonido del vino con TargetDataLine (1)
Haga uso del método AudioSystem.write (). Es mucho mas facil
targetDataLine.open(format);
targetDataLine.start();
AudioInputStream ais=new AudioInputStream(targetDataLine);
AudioFileFormat.Type fileformat=AudioFileFormat.Type.WAVE;
/*
Other Audio file formats supported:
AudioFileFormat.Type.AU
AudioFileFormat.Type.AIFF
AudioFileFormat.Type.AIFC
AudioFileFormat.Type.SND
*/
File audoutputfile=new File(''myfile'');
//adjust extension according to AudioFileFormat
AudioSystem.write(ais,fileformat, audoutputfile);
He escrito una pequeña aplicación de Java para fines de prueba que captura el sonido de un mezclador en ubuntu 12.04.
El código funciona bien, puedo capturar el sonido de todas las aplicaciones a excepción de cualquier cosa que se ejecute en Wine.
Cada vez que inicio mi programa, después de haber iniciado Wine, la llamada a targetDataLine.read()
bloqueará para siempre
Cuando Wine no se ejecuta en segundo plano, muestra correctamente 0
cuando no hay entrada, o el número de bytes leídos si hay entrada, como se esperaba.
Si inicio mi programa antes de iniciar Wine, el controlador de sonido no estará disponible dentro del vino.
He intentado usar tanto los mezcladores proporcionados por Alsa como el dispositivo predeterminado, el mismo resultado.
Podría imaginar que el vino de alguna manera bloquea a Alsa (por alguna razón), pero ¿por qué una simple llamada a TargetDataLine.read()
haría que el sonido fallara en Wine? mixerInfo[0]
está predeterminado en mi sistema por cierto, y la aplicación siempre se está ejecutando fuera de Wine utilizando el último JRE de Oracle (7).
private void readSound ()
{
byte tempBuffer[] = new byte[10000];
int cnt = 0;
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
System.out.println("Available mixers:");
for (int p = 0; p < mixerInfo.length; p++)
System.out.println(mixerInfo[p].getName());
format = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format);
Mixer mixer = AudioSystem.getMixer(mixerInfo[0]);
try
{
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
targetDataLine.open(format);
}
catch(Exception e)
{
e.printStackTrace();
}
targetDataLine.start();
while (true)
{
i++;
cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
System.out.println("read " + cnt + " bytes:" + tempBuffer[i]);
calculateLevel(tempBuffer, 0, 200);
targetDataLine.flush();
System.out.println(level);
}
}