Ответ 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
. На самом деле достаточно просто.