Simulate microphone Input

女生的网名这么多〃 提交于 2019-12-07 08:06:10

问题


I am trying to write a little program that reads a wav file and sends the output as if it would come from my microphone. Unfortunately I do not have much experience with the sound API.

Background: What I am basically trying to realize is a program that plays a sound while I am in a voicechat (i.e Teamspeak, Ventrilo). To get that to work now I would have to switch the recording device to "What you hear", play the sound and then switch back to microphone. The program should simulate input from the microphone.

So far I could not get any further than just playing the sound. I guess I just need a different 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();
}
 }

Solution: Install VB Audio Cable (http://vb-audio.pagesperso-orange.fr/Cable/). It's donationware. Make VB-Output standard recording device. In the microphone properties choose VB-Input as playback.

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:


You can install some program like Virtual Audio Cable and from your music player redirect playing sound to virtual input. In your program you must listen that virtual input source and you can for test redirect to normal headphones or speaker received signal or saved it to file.



来源:https://stackoverflow.com/questions/21193109/simulate-microphone-input

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!