Я совершенно неопытен в работе с потоками данных и хотел передать getUserMedia в опус-конвертер в качестве учебного проекта, а затем - возможно, слишком наивно - отправить его через socket.io. Моя, может быть, ошибочная идея заключается в том, что я постоянно делю и преобразовываю поток по частям.
Я благодарен за все объяснения, которые немного лучше объясняют общую обработку потока, так как я сказал, что это учебный проект, я знаю, что с WebRT C доступно гораздо лучшее решение.
В качестве кодера я хотел использовать https://github.com/ImagicTheCat/libopusjs. Альтернативы приветствуются, но я хотел бы придерживаться идеи кодировщика на основе wasm.
Что у меня есть (в качестве первого шага, моя идея заключалась в том, чтобы кодировать поток, декодировать и выводить его снова):
if (navigator.mediaDevices) {
console.log('getUserMedia supported.');
navigator.mediaDevices.getUserMedia ({audio: true, video: true})
.then(function(stream) {
video.srcObject = stream;
video.onloadedmetadata = function(e) {
video.play();
video.muted = true;
};
var audioCtx = new AudioContext();
var source = audioCtx.createMediaStreamSource(stream);
var enc = new libopus.Encoder(1,48000,24000,20,false);
=> enc stream
var dec = new libopus.Decoder(1,48000);
=> perspectively send this enc stream via socketio
=> dec enc stream => RESULT stream
RESULT.connect(audioCtx.destination);
})
.catch(function(err) {
console.log('The following gUM error occured: ' + err);
});
} else {
console.log('getUserMedia not supported on your browser!');
}