如何在Java中同步多个ogg文件的播放?

时间:2017-02-28 13:24:48

标签: java ogg vorbis

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

看起来字节读取和时间之间的关系可能不是线性的?也许这就在我的脑海里。

0 个答案:

没有答案