2012-07-18 41 views
48

我寫了一個小型的Java應用程序用於測試目的,它從ubuntu 12.04上的混音器捕獲聲音。用TargetDataLine從Wine中捕獲聲音

該代碼工作正常,我可以捕獲除了在Wine下運行的所有應用程序的聲音。

每當我開始我的計劃,已經開始葡萄酒後,調用targetDataLine.read()將永遠阻止

當酒不是在後臺運行,它正確輸出0當沒有輸入,或字節數如預期的那樣閱讀是否有輸入。

如果我在啓動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); 
    } 
} 
+2

你可以請在這個帖子中提供這兩種情況下的程序輸出,Wine運行時和Wine沒有運行的情況。 – 2015-12-06 11:05:38

+0

我認爲使用DataLine :: available可能有助於阻止。 – IceGlow 2016-07-25 15:37:23

+2

檢查Wine的配置以查看它如何訪問音頻。 http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-alsa-only – IceGlow 2016-07-25 15:39:21

回答

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); 
+0

哦。我現在才注意到問題的日期...... – 2016-10-17 16:21:22