Я хочу смешивать два потока аудио с помощью java-микшера и записывать вывод в файл.Смешивание двух потоков аудио с помощью Java-микшера
Чтобы сделать это, я захвачу вход моих двух микрофонов, читая от TargetDataLines моих микрофонных смесителей:
//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
. Теперь я хочу смешать эти два байтовых массива, содержащие мои образцы звука, полученные от микрофона, в новый массив байтов , и я хочу использовать другой Java-микшер для этого.
Для этого я создаю два SourceDataLine и один 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();
, а затем внутри «а» я добавлю:
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);
}
однако, в то время как звук на самом деле правильно воспроизводится через наушники, массив результатов остается пустым. Как я могу решить эту проблему? Что я делаю не так?
Вы хотите сохранить результат или воспроизвести его? и если вы играете в нее, у вас есть еще одна звуковая карта? целевая линия - захват не для записи, поэтому результат не будет сохранен; вам нужно уточнить, что именно вы хотите сделать; у вас много звуковых карт? До того места, где вы получаете два микрофона, вы в порядке – gpasch
Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –
У меня два микрофона на моих 2 веб-камерах и 1 звуковая карта. Мне нужно захватить сигнал, который поступает на мой динамик из моей программы. Я хочу захватить целевую линию, связанную с этим микшером. – Hossein