我有一首歌在不同的 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;
}
似乎读取的字节数和时间之间的关系可能不是线性的?也许那是在我的脑海里。