Поскольку вы читаете все "speech.mp3", вы можете создать несколько AudioBufferSourceNode
объектов для различных фрагментов mp3-файла.Я могу придумать как минимум два пути.Пожалуй, самый простой (не проверенный):
for (k = 0; k < n; ++k) {
src[k] = new AudioBufferSourceNode(context, decodedData);
src[k].connect(context.destination);
src[k].start(time[k], offset[k], duration[k]);
}
Каждый источник использует один и тот же AudioBuffer, но когда вы вызываете start()
, вы указываете смещение offset[k]
и продолжительность duration[k]
из decodedDataкоторую вы хотите воспроизвести.
В качестве альтернативы, вы можете нарезать оригинал decodeData
на множество меньших AudioBuffer
объектов, содержащих фрагменты, которые вы хотите использовать.Тогда каждый AudioBufferSourceNode
может использовать этот маленький буфер в качестве источника.Это, впрочем, тратит пространство на создание всех маленьких буферов.
Примерно так (не проверено):
for (k = 0; k < n; ++k) {
// Grab the part of the mp3 that we want.
d[k] = decodedData.slice(start[k], end[k]);
b[k] = new AudioBuffer({length: d[k].length, sampleRate: context.sampleRate});
b[k].copyToChannel(d[k], 0, 0);
s[k] = new AudioBufferSourceNode(context, {buffer: b[k]);
// Play back this piece of the mp3 at the appropriate time.
s[k].start(time[k]);
}