1

我有一首歌在不同的 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;
}

似乎读取的字节数和时间之间的关系可能不是线性的?也许那是在我的脑海里。

4

0 回答 0