gpt4 book ai didi

java - 使用 TargetDataLine 从 Wine 中捕获声音

转载 作者:IT老高 更新时间:2023-10-28 12:35:22 25 4
gpt4 key购买 nike

我为测试目的编写了一个小型 Java 应用程序,它从 ubuntu 12.04 上的混音器中捕获声音。

代码运行良好,我可以捕捉所有应用程序的声音,除了在 Wine 下运行的任何应用程序。

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

Wine没有在后台运行时,在没有输入时正确输出0,或者有输入时读取的字节数,符合预期。

如果我在启动 Wine 之前启动我的程序,声音驱动程序将在 wine 中不可用。

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

我可以想象 wine 以某种方式锁定了 Alsa(无论出于何种原因),但是为什么对 TargetDataLine.read() 的简单调用会导致 Wine 中的声音失败?mixerInfo[0] 顺便说一句在我的系统上是默认设置,当然应用程序总是使用 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);

关于java - 使用 TargetDataLine 从 Wine 中捕获声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com