2014-01-17 273 views
4

我正在嘗試編寫一個讀取wav文件併發送輸出的小程序,就好像它會來自我的麥克風一樣。不幸的是,我對聲音API沒有多少經驗。模擬麥克風輸入

背景:我基本上試圖實現的是一個程序,當我在聊天室(即Teamspeak,Ventrilo)時播放聲音。爲了讓它現在可以工作,我必須將錄音設備切換到「您聽到的聲音」,播放聲音然後切換回麥克風。該程序應模擬來自麥克風的輸入。

到目前爲止,我只能播放聲音。我想我只需要一個不同的SourceLine?

public class Player { 
private final int BUFFER_SIZE = 128000; 
private AudioInputStream audioStream; 
private AudioFormat audioFormat; 
private SourceDataLine sourceLine; 

public void playSound(File soundFile) { 
    try { 
     audioStream = AudioSystem.getAudioInputStream(soundFile); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    audioFormat = audioStream.getFormat(); 
    DataLine.Info infoIn = new DataLine.Info(SourceDataLine.class, 
      audioFormat); 
    try { 
     sourceLine = (SourceDataLine) AudioSystem.getLine(infoIn); 
     sourceLine.open(audioFormat); 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 

    sourceLine.start(); 

    int nBytesRead = 0; 
    byte[] abData = new byte[BUFFER_SIZE]; 
    while (nBytesRead != -1) { 
     try { 
      nBytesRead = audioStream.read(abData, 0, abData.length); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (nBytesRead >= 0) { 
      @SuppressWarnings("unused") 
      int nBytesWritten = sourceLine.write(abData, 0, nBytesRead); 
     } 
    } 
    sourceLine.drain(); 
    sourceLine.close(); 
} 
} 

解決方案: 安裝VB音頻線(http://vb-audio.pagesperso-orange.fr/Cable/)。這是捐贈軟件。製作VB輸出標準錄音設備。在麥克風屬性中選擇VB-Input作爲播放。

public class Player { 
private final int BUFFER_SIZE = 128000; 
private AudioInputStream audioStream; 
private AudioFormat audioFormat; 
private SourceDataLine sourceLine; 

public void playSound(File soundFile) { 
    try { 
     audioStream = AudioSystem.getAudioInputStream(soundFile); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    audioFormat = audioStream.getFormat(); 
    DataLine.Info infoIn = new DataLine.Info(SourceDataLine.class, 
      audioFormat); 
    try { 
     Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo(); 
     Mixer mixer = null; 
     for (int i = 0; i < mixerInfos.length; i++) { 
      System.out.println(mixerInfos[i].getName()); 
      if (mixerInfos[i].getName().equals(
        "CABLE Input (VB-Audio Virtual Cable)")) { 
       mixer = AudioSystem.getMixer(mixerInfos[i]); 
       break; 
      } 
     } 
     sourceLine = (SourceDataLine) mixer.getLine(infoIn); 
     sourceLine.open(audioFormat); 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    sourceLine.start(); 
    int nBytesRead = 0; 
    byte[] abData = new byte[BUFFER_SIZE]; 
    while (nBytesRead != -1) { 
     try { 
      nBytesRead = audioStream.read(abData, 0, abData.length); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (nBytesRead >= 0) { 
      @SuppressWarnings("unused") 
      int nBytesWritten = sourceLine.write(abData, 0, nBytesRead); 
     } 
    } 
    sourceLine.drain(); 
    sourceLine.close(); 
} 
} 
+1

我很困惑;你的意思是「好像它會來自我的麥克風」? –

回答

1

您可以安裝一些程序,如虛擬音頻線,並從音樂播放器重定向播放聲音到虛擬輸入。在您的程序中,您必須聽取虛擬輸入源,並且您可以將測試重定向到普通耳機或揚聲器接收信號或將其保存到文件。

+0

是的,工作。我必須安裝VoiceMeeter。這與你提到的虛擬音頻電纜一樣。我將用最終的解決方案編輯我的問題。我對如何獲取線路信息感到不滿意。如果你知道如何調用調音臺而不是遍歷所有調音臺,有沒有其他方法? –