使用TargetDataLine从Wine中捕获声音

我写了一个小型Java应用程序用于testing目的,从Ubuntu 12.04上的混音器捕获声音。

代码工作正常,我可以捕获所有应用程序的声音,除了在Wine下运行的任何应用程序。

每当我启动我的程序,启动Wine后,对targetDataLine.read()的调用将永远阻塞

当Wine不在后台运行时,如果没有input,则正确地输出0 ,或者如果有input,则正确地输出读取的字节数。

如果我在开始Wine之前开始我的程序,声音驱动程序将无法在酒中使用。

我曾尝试使用由Alsa提供的混音器以及默认设备,相同的结果。

我可以想象,葡萄酒以某种方式lockingAlsa(无论出于何种原因),但为什么简单地调用TargetDataLine.read()会导致Wine在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); } } 

使用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); 
Interesting Posts