使用Java混合器混合两个音频流



我想使用Java混音器混合两个音频流,然后将输出写入文件中。

为此,我通过从麦克风混合器的目标塔林读取两个麦克风的输入:

    //microphone TargetDataLines
    TargetDataLine finalIn = null;
    TargetDataLine finalIn2 = null;
    Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
    for (Mixer.Info info: mixerInfos){
        Mixer m = AudioSystem.getMixer(info);
        Line.Info[] lineInfos = m.getSourceLineInfo();
        System.out.println("****mixer name:" + info.getName());
        if(info.getName().equals("C920 [plughw:1,0]"))
            finalIn=(TargetDataLine) m.getLine(m.getTargetLineInfo()[0]);
        if(info.getName().equals("C920_1 [plughw:3,0]"))
            finalIn2=(TargetDataLine) m.getLine(m.getTargetLineInfo()[0]);
        for (Line.Info lineInfo:lineInfos){
            System.out.println ("n source line info: "+lineInfo);
        }
        lineInfos = m.getTargetLineInfo();
        for (Line.Info lineInfo:lineInfos){
            System.out.println ("target line info: "+lineInfo);
        }
    }
    AudioFormat format = new AudioFormat(8000,16, 1, true,false);
    finalIn.open(format,2000);
    finalIn.start();
    finalIn2.open(format,2000);
    finalIn2.start();
    int numBytesRead;
    byte[] targetData = new byte[finalIn.getBufferSize() / 5];
    int numBytesRead2;
    byte[] targetData2 = new byte[finalIn2.getBufferSize() / 5];
    while (true) {
            numBytesRead = finalIn.read(targetData,0,targetData.length);
            numBytesRead2 = finalIn2.read(targetData2, 0, targetData2.length);

从麦克风捕获的结果数据将在targetData中,targetData2。现在,我想将这两个字节阵列混合在一起,其中包含从麦克风收到的声音样本中的新字节阵列,我想为该

为此,我使用以下代码创建了两个源自质体和一个targetDataline:

        DataLine.Info targetInfo = new DataLine.Info(TargetDataLine.class, format);
        DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format);
        SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(sourceInfo);
        SourceDataLine sourceLine2 = (SourceDataLine) AudioSystem.getLine(sourceInfo);
        sourceLine.open(format,2000);
        sourceLine.start();
        sourceLine2.open(format,2000);
        sourceLine2.start();
        TargetDataLine targetLine = (TargetDataLine)        AudioSystem.getLine(targetInfo);
        targetLine.open(format,2000);
        targetLine.start();

然后在" while"内部我会添加:

    byte[] result = new byte[finalIn.getBufferSize() / 5];
    while (true) {
            numBytesRead = finalIn.read(targetData,0,targetData.length);
            numBytesRead2 = finalIn2.read(targetData2, 0, targetData2.length);
            sourceLine.write(targetData, 0, numBytesRead);
            sourceLine.write(targetData2, 0, numBytesRead2);
            targetLine.read(result, 0, numBytesRead2);
    }

但是,虽然声音实际上是通过我的耳机正常播放的,但结果阵列保持空。我怎么解决这个问题?我在做什么错?

我想知道您是否对Java Mixer做什么有误解。我认为这堂课的名字很差,因为我作为音频工程师的背景经验。在我看来,搅拌机是您结合各种音轨的地方。这是不是 Java混音器的作用。

我认为要做您想做的事,您需要并行阅读两行。对于每个人,您将读取字节的缓冲区,并且必须将字节转换为PCM数据。然后,您可以将PCM数据添加在一起,并将其转换回字节并输出。

有一个好的教程,可以在此处显示如何获取单个字节/帧。在页面上的一小路,有一个代码示例。注意评论的位置:

// Here, do something useful with the audio data that's 
// now in the audioBytes array...

此示例从AudioInputStream读取,但是从TargetDatalines获取单个字节的技术并没有什么不同。当然,您将通过两行而不是从单个AI读取。您将要做的"有用的事情"是并行地按照框架添加PCM数据。

将音频数据求和后,您可能可以使用我在另一个站点上写的一些代码,该代码会采用PCM流并将其写入WAV文件。希望该页面上的讨论足够清楚,您可以遵循。

最新更新