我编写了一个用于测试目的的小型Java应用程序,用于从ubuntu 12.04上的混音器中捕获声音。
代码工作正常,我可以从所有应用程序捕获声音,除了在Wine下运行的任何东西。
每当我启动我的程序时,在启动Wine之后,对targetDataLine.read()
的调用将永远阻止
当Wine没有在后台运行时,它会在没有输入时正确输出0
,或者如果有输入则输出正确的字节数。
如果我在开始Wine之前启动我的程序,那么声音驱动程序将无法在wine中使用。
我尝试过使用Alsa提供的混音器以及默认设备,结果相同。
我可以想象葡萄酒会以某种方式锁定Alsa(无论出于何种原因),但为什么简单地调用TargetDataLine.read()
会导致Wine失败?
mixerInfo[0]
在我的系统btw上是默认的,并且应用程序当然总是使用oracle的最新JRE(7)在Wine之外运行。
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);
}
}
答案 0 :(得分:1)
使用AudioSystem.write()方法。它更容易
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);