我想使用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文件。希望该页面上的讨论足够清楚,您可以遵循。