Получение исходных данных PCM из webAudio/mozAudio

Я пытаюсь сохранить вывод из API webAudio для будущего использования, пока я думаю, что получение данных PCM и сохранение его в виде файла будет делать мое ожидание, мне интересно, поддерживает ли webAudio или mozAudio сохранение выходного потока, если не как я могу получить данные pcm из выходного потока

Ответ 1

Здесь нет хорошего представления о требованиях, помимо попытки захвата веб-аудио каким-либо программным способом. Презумпция здесь заключается в том, что вы хотите сделать это из кода, выполняемого в JavaScript на просматриваемой странице, но это также не совсем понятно.

Как указывает Incognito, вы можете сделать это в Chrome, используя разворот обратного вызова decodeAudioData(). Но это может быть слишком сложно для ваших целей, если вы просто пытаетесь захватить, например, вывод одного веб-потока и декодировать его в PCM для использования в ваших звуковых инструментах по выбору.

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

Как известно, вы уже кодируете аналоговые сигналы в любом случае по вашему желанию для кодирования PCM. Очевидно, что делайте это только в том случае, если у вас есть законное право использовать отбираемые файлы.

Независимо от выбранного вами маршрута, удачи вам. Будь то программная рассеивание потока или выборочная выборка, теперь у вас должно быть более чем достаточно информации для продолжения.


Изменить: На основе дополнительной информации от OP это похоже на необходимое решение (объединенное из здесь и здесь, используя реализация NodeJS fs):

var fs = require('fs');

function saveAudio(data, saveLocation) {
    var context = new (window.AudioContext || window.webkitAudioContext)();
    var source = context.createBufferSource();

    if(context.decodeAudioData) {
        context.decodeAudioData(data, function(buffer) {
            fs.writeFile(saveLocation, buffer, function (err) {
                if (err) throw err;
                console.log('It\ saved!');
            });
        }, function(e) {
            console.log(e);
        });
    } else {
        var buffer = context.createBuffer(data, false /*mixToMono*/);
        fs.writeFile(saveLocation, buffer, function (err) {
            if (err) throw err;
            console.log('It\ saved!');
        });
    }
}

( Предупреждение: непроверенный код. Если это не сработает, возможны изменения.)

Это эффективно выводит decodeAudioData из API веб-аудио, декодирует PCM из поставляемого data, затем пытается его сохранить к цели saveLocation. На самом деле достаточно просто.

Ответ 2

В последнем проекте API WebAudio представлен OfflineAudioContext именно для этой цели.

Вы используете его точно так же, как обычный AudioContext, но с дополнительным методом startRendering() для запуска автономного рендеринга, а также обратный вызов oncomplete, чтобы вы могли действовать после завершения рендеринга.

Ответ 3

Chrome должен поддерживать его (или, по крайней мере, в основном поддерживать эту новую функцию).

decodeAudioData()

Когда decodeAudioData() закончен, он вызывает функцию обратного вызова, которая предоставляет декодированные аудиоданные PCM в качестве AudioBuffer

Он почти идентичен способу XHR2 делать вещи, поэтому вы, вероятно, захотите сделать для него слой абстракции.

Примечание. Я не тестировал, что он работает, но я вижу только одну ошибку в Chrome относительно этого, указывая, что он работает, но не работает для некоторых файлов.

Ответ 4

Я думаю, что то, что вы ищете, может быть достигнуто с помощью функции startRendering в Web Audio. Я не знаю, были ли ответы выше, но если они этого не сделали - вот вам кое-что, чтобы вас поймать:

https://bugs.webkit.org/show_bug.cgi?id=57676 (прокрутите вниз до комментария три)

Эта часть все еще недокументирована, поэтому ее не видно в спецификации, но вы можете console.log аудиоконференции, чтобы подтвердить, что она на самом деле там. Я только сделал предварительный тест с ним, но я думаю, что это должен быть ответ на ваш вопрос.