Я пытаюсь сохранить вывод из API webAudio для будущего использования, пока я думаю, что получение данных PCM и сохранение его в виде файла будет делать мое ожидание, мне интересно, поддерживает ли webAudio или mozAudio сохранение выходного потока, если не как я могу получить данные pcm из выходного потока
Получение исходных данных PCM из webAudio/mozAudio
Ответ 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() закончен, он вызывает функцию обратного вызова, которая предоставляет декодированные аудиоданные PCM в качестве AudioBuffer
Он почти идентичен способу XHR2 делать вещи, поэтому вы, вероятно, захотите сделать для него слой абстракции.
Примечание. Я не тестировал, что он работает, но я вижу только одну ошибку в Chrome относительно этого, указывая, что он работает, но не работает для некоторых файлов.
Ответ 4
Я думаю, что то, что вы ищете, может быть достигнуто с помощью функции startRendering в Web Audio. Я не знаю, были ли ответы выше, но если они этого не сделали - вот вам кое-что, чтобы вас поймать:
https://bugs.webkit.org/show_bug.cgi?id=57676 (прокрутите вниз до комментария три)
Эта часть все еще недокументирована, поэтому ее не видно в спецификации, но вы можете console.log аудиоконференции, чтобы подтвердить, что она на самом деле там. Я только сделал предварительный тест с ним, но я думаю, что это должен быть ответ на ваш вопрос.