我有一首歌曲在不同的ogg文件中有不同的曲目。我可以使用Vorbis SPI一起播放这些ogg文件以获得完整的歌曲。但是我这样做是通过在一个单独的线程中播放每个ogg而我没有防止每个ogg文件的播放失去同步的保护。
您将如何确保他们保持同步。理想情况下,如果有任何延迟读取,所有曲目都会暂停。
一旦我开始工作,我也想要与屏幕上显示的图形同步。
我觉得我需要的是某种时间/位置记录,所以我知道每个ogg回放的距离。然后我可以延迟其他线程,直到所有内容都恢复同步。
我在早期,所以我很乐意考虑其他播放库。
编辑:
根据JimmyB的建议,我现在能够读入4字节缓冲区。然后,我使用以下代码将缓冲区添加到一起:
for (int i = 0; i < byteLength; i++) {
data[0][i] = data[0][i];
for (int j = 1; j < numInputs; j++) {
data[0][i] += data[j][i];
}
}
这确实有效,但输出失真。我怀疑剪辑正在发生。如何在没有这种效果的情况下组合声音字节?
编辑2: 将字节除以输入数量会停止剪辑,但会大大降低播放质量。
编辑3: 我想我也在失去赛道之间的同步。我的阅读方法如下:
// return true if there is more to come
private boolean fillBuffer(AudioInputStream audioInputStream, byte[] soundBytes) throws IOException {
byte empty = 0;
int offset = 0;
while (offset != soundBytes.length) {
int bytesRead;
try {
bytesRead = audioInputStream.read(soundBytes, offset, soundBytes.length - offset);
offset += bytesRead;
if (bytesRead == -1) {
Arrays.fill(soundBytes, offset, soundBytes.length, empty);
return false;
}
} catch (Exception e) {
e.printStackTrace();
LOGGER.info("Boom");
}
}
return true;
}
看起来字节读取和时间之间的关系可能不是线性的?也许这就在我的脑海里。