Как получить данные в AudioBuffer по времени в секундах? - PullRequest
0 голосов
/ 27 апреля 2020

Я знаю, как decodeAudioData из AudioContext .
Чего я не знаю, так это как обработать возвращенный AudioBuffer из decodeAudioData .

Предположим, у нас есть некоторые возвращенные AudioBuffer

{
    length: 12012146, 
    duration: 250.25304166666666, 
    sampleRate: 48000, 
    numberOfChannels: 2
}

Теперь я могу getChannelData () из AudioBuffer , что дает мне массив с длиной AudioBuffer.length .
Я знаю продолжительность в AudioBuffer равен AudioBuffer.length / AudioBuffer.sampleRate.

Я хотел бы создать функцию, которая ожидает переменную time (в секундах) и затем возвращает данные из AudioBuffer.getChannelData () на основе этой переменной.
Так что я бы назвал getChannelDataFromTime(seconds), и он вернул бы мне массив (для меня) неизвестного размера.

Я что-то упустил, что облегчит мою работу?

1 Ответ

3 голосов
/ 27 апреля 2020

Метод, который вы ищете, уже существует. По крайней мере, это очень похожая функция. Это называется copyFromChannel(). Он скопирует часть данных канала в заданную Float32Array.

Допустим, вы хотите скопировать данные канала за первую секунду. В этом случае вам нужно сначала создать Float32Array, который может хранить сэмплы в течение одной секунды.

const seconds = 1;
const channelData = new Float32Array(Math.round(audioBuffer.sampleRate * seconds));

Затем вы можете скопировать данные в этот Float32Array.

audioBuffer.copyFromChannel(channelData, 0, 0);

Первый параметр цифр c определяет канал для копирования данных, а второй параметр чисел c определяет смещение в выборках.

...