首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用TargetDataLine捕获葡萄酒中的声音

用TargetDataLine捕获葡萄酒中的声音
EN

Stack Overflow用户
提问于 2012-07-19 05:26:17
回答 1查看 1.4K关注 0票数 49

我已经写了一个用于测试的小型Java应用程序,用于在ubuntu 12.04上捕获混音器中的声音。

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

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

当Wine没有在后台运行时,它会在没有输入的情况下正确地输出0,或者在有输入的情况下正确地输出读取的字节数。

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

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

我可以想象,Wine以某种方式锁定了Alsa (不管是什么原因),但是为什么对TargetDataLine.read()的简单调用会导致wine中的声音失败呢?顺便说一下,我的系统中mixerInfo[0]是默认的,当然,应用程序总是使用oracle的最新JRE (7)在Wine之外运行。

代码语言:javascript
复制
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);
   }
}
EN

回答 1

Stack Overflow用户

发布于 2016-10-18 00:20:16

使用AudioSystem.write()方法。这要容易得多

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11550614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档