Эквивалент AudioBuffer getChannelData() для MediaStream (или MediaStreamAudioSourceNode)?

Я использую decodeAudioData AudioContext в mp3-файле, что дает мне AudioBuffer. С помощью этого звукового буфера я продолжаю рисовать форму волны этого mp3-файла на холсте, используя данные, возвращенные getChannelData().

Теперь я хочу использовать тот же код для рисования формы волны аудиоданных MediaStream, что означает, что мне нужны такие же входные данные/данные. Я знаю, что MediaStream содержит информацию в реальном времени, но должен быть способ получить доступ ко всем новым данным из MediaStream как

Float32Array, содержащий данные PCM

это то, что возвращает getChannelData AudioBuffer.

Я пытался обернуть MediaStream в MediaStreamAudioSourceNode и передать его в AnalyserNode, чтобы использовать getFloatFrequencyData() (который возвращает Float32Array), но я могу сказать, что данные отличаются от данных, которые я получаю от getChannelData(). Может быть, это не данные "PCM"? Как я могу получить данные "PCM"?

Надеюсь, это понятно. Спасибо за помощь!


person maximedupre    schedule 28.10.2016    source источник


Ответы (2)


Во-первых, заметим, что AnalyserNode лишь время от времени производит выборку данных, но не обрабатывает их все. Я думаю, что это хорошо соответствует вашему сценарию, но просто знайте, что если вам нужны все данные (например, вы буферизуете звук), вам нужно будет использовать ScriptProcessor вместо этого сегодня.

Предполагая, что вам просто нужны образцы данных, вы можете использовать AnalyserNode, но вы должны вызывать getFloatTimeDomainData(), а не getFloatFrequencyData(). Это даст вам данные PCM (FrequencyData дает вам FFT данных PCM).

person cwilso    schedule 28.10.2016
comment
getFloatTimeDomainData() не возвращает данные того же типа, что и getChannelData(), поскольку результат, который я получаю от рисования формы волны на холсте с помощью getFloatTimeDomainData(), не очень хорош. Вы уверены, что оба массива представляют одни и те же данные и организованы одинаково? - person maximedupre; 29.10.2016
comment
Если MediaStream имеет несколько каналов (скажем, стерео), AnalyserNode смешивает их в моно. Вам нужно будет разделить данные MediaStream (используя ChannelSplitterNode, чтобы получить нужный трек и отправить его в анализатор. - person Raymond Toy; 29.10.2016
comment
@RaymondToy Спасибо, Рэймонд, ты спас меня!! Можете ли вы опубликовать это как ответ? Или cwilso, можете ли вы обновить свой ответ, включив в него эту дополнительную информацию? - person maximedupre; 31.10.2016
comment
Рад, что это сработало для вас! Я не думаю, что это будет правильным ответом на ваш вопрос. cwilso имеет правильный ответ на ваш вопрос. - person Raymond Toy; 04.11.2016

создайте MediaStreamDestination с аудиоконтекстом, а затем новый MediaRecorder из потока,

var options = {mimeType: 'audio/webm;codecs=pcm'};
mediaRecorder = new MediaRecorder(stream, options);
person wang eason    schedule 24.08.2018