#javascript #node.js #audio #web-audio-api
#javascript #node.js #Аудио #web-audio-api
Вопрос:
Итак, я пытаюсь манипулировать аудио, которое поступает от клиента на сервер, а затем возвращать заново обработанный аудио обратно клиенту. Конечно, это приводит к ошибке, что Node не поддерживает web-audio-api, поэтому я использую узловую версию web-audio-api вместе с библиотекой WebRTC.
Поскольку я новичок в мире WebRTC, я опирался на эти примеры, в которых используется библиотека WebRTC. Используя пример audio-video-loopback в качестве отправной точки, я использовал некоторые из библиотек none standard API для создания аудиоприемника, который позволяет мне напрямую обращаться к сэмплам с клиента. На данный момент я просто хочу изменить громкость, поэтому я просто меняю значения и вставляю их в новую дорожку, как сказано в документе (прокрутите вниз до Programmatic Audio), чтобы сделать это. В конце я просто хочу вернуться к недавно созданной дорожке, что делается с помощью .replaceTrack
метода (который, я полагаю, повторно запускает повторное согласование).
Вот что я получил на данный момент для кода сервера (клиент такой же, как исходный пример, найденный по ссылке выше):
const { RTCAudioSink, RTCAudioSource } = require("wrtc").nonstandard;
function beforeOffer(peerConnection) {
const audioTransceiver = peerConnection.addTransceiver("audio");
const videoTransceiver = peerConnection.addTransceiver("video");
let { track } = audioTransceiver.receiver;
const source = new RTCAudioSource();
const newTrack = source.createTrack();
const sink = new RTCAudioSink(track);
const sampleRate = 48000;
const samples = new Int16Array(sampleRate / 100); // 10 ms of 16-bit mono audio
const dataObj = {
samples,
sampleRate,
};
const interval = setInterval(() => {
// Update audioData in some way before sending.
source.onData(dataObj);
});
sink.ondata = (data) => {
// Do something with the received audio samples.
const newArr = data.samples.map((el) => el * 0.5);
dataObj[samples] = newArr;
};
return Promise.all([
audioTransceiver.sender.replaceTrack(newTrack),
videoTransceiver.sender.replaceTrack(videoTransceiver.receiver.track),
]);
}
Неудивительно, что это не работает, я просто получаю тишину обратно, даже если dataObj
содержит правильно обработанные сэмплы, которые затем передаются newTrack
при source.onData
вызове.
Возможно ли то, что я пытаюсь сделать, даже на стороне сервера? Любые предложения приветствуются, как я уже сказал, я новичок в WebRTC.