我正在尝试使用 SourceDataLine 编写 2 个不同的缓冲区(缓冲区 A 和 B),以同时播放声音。但它不断在缓冲区 A 和缓冲区 B 之间切换,我是否需要在将缓冲区写入我的 SourceDataLine 之前将它们合并在一起,或者有没有办法同步播放它们?
class PlayThread extends Thread {
byte[] buffer = new byte[2 * 1024];
@Override
public void run() {
try {
while (true) {
DatagramPacket receive = new DatagramPacket(buffer, buffer.length);
mDatagramSocket.receive(receive);
mSourceDataLine.write(receive.getData(), 0, receive.getData().length);
System.out.println("Received!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我有 2 个带有不同传入缓冲区的 PlayThread 实例。下面是初始化 SourceDataLine 的函数。
private void init() {
try {
DataLine.Info sourceDataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat);
DataLine.Info targetDataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
Mixer mixer = AudioSystem.getMixer(mixerInfo[3]);
mSourceDataLine = (SourceDataLine) AudioSystem
.getLine(sourceDataLineInfo);
mTargetDataLine = (TargetDataLine) mixer.getLine(targetDataLineInfo);
mSourceDataLine.open(audioFormat, 2 * 1024);
mSourceDataLine.start();
mTargetDataLine.open(audioFormat, 2 * 1024);
mTargetDataLine.start();
} catch (LineUnavailableException ex) {
ex.printStackTrace();
}
}
谢谢你。