Слияние потока холста с аудиопотоком getUserMedia не слышно (kurento / webrtc)

Когда у пользователя нет видеоустройства, я использую видеопоток холста и объединяю видеодорожку с потоком, полученным из getUserMedia (аудиопоток). Одноранговый узел подключается идеально, но другие пользователи не слышат звук.

Если я покажу свой экран и объединю эту видеодорожку с потоком, звук будет работать отлично. Я заметил, что CanvasMediaStream не работает, но MediaStream работает отлично. Я не знаю, является ли это проблемой в конце куренто или я что-то делаю не так.


person Shubham    schedule 21.01.2021    source источник
comment
CanvasMediaStream больше не должен существовать ... Это тоже происходит в Chrome? Вы слышите звук при локальном потреблении? Что именно вы хотите от нас? Похоже, вы уже знаете, как исправить: добавьте canvascapturemediastreamtrack в аудио MediaStream или даже создайте новый MediaStream из обоих треков.   -  person Kaiido    schedule 22.01.2021
comment
Спасибо за ответ @Kaiido. Без потокового видео куренто не работает, из-за этого я пытался добавить фиктивную видеодорожку. При этом вызов инициируется, но звук не слышен. Это происходит как в браузерах Chrome, так и в Firefox. Есть ли другой способ добавить видеодорожку? Я слышу звук, если добавляю видеодорожку для демонстрации экрана. Я просто хочу, чтобы другие пользователи слышали мой голос во всех аспектах.   -  person Shubham    schedule 22.01.2021
comment
Если это также происходит в Chrome, то это не потому, что поток является CanvasMediaStream. Тем не менее вы можете попробовать сделать new MediaStream([ canvasStream.getVideoTracks()[0], micStream.getAudioTracks()[0] ]). Также вы можете вызывать некоторые методы рисования через равные промежутки времени (по крайней мере, каждые 5 секунд в Chrome) в контексте холста, на котором вы захватили поток, даже ctx.clearRect() должно подойти, но для безопасности начните с fillRect(0,0,1,1). В противном случае браузер может отключить дорожку холста, что может быть проблемой для kurento (я не знаю).   -  person Kaiido    schedule 22.01.2021
comment
@Kaiido хорошо, спасибо, попробую это решение. Но есть ли у меня альтернативные варианты, помимо использования потока холста?   -  person Shubham    schedule 22.01.2021
comment
Если вам нужен видеопоток? Не уверен ... Даже короткий цикл MediaElement MediaStream будет генерировать событие отключения звука в каждом цикле, поэтому, если у вашего бэкэнда действительно есть проблемы с отключенными дорожками, он также может выйти из строя, хотя, возможно, стоит попробовать, но я подозреваю, что просто опираюсь на контекст холста каждые 0,5 секунды будет делать.   -  person Kaiido    schedule 22.01.2021
comment
@Kaiido спасибо за решение. Это действительно работает!   -  person Shubham    schedule 22.01.2021


Ответы (1)


Нет Kurento для тестирования, но проблема, вероятно, в том, что CanvasCaptureMediaStreamTrack отключается после некоторого времени бездействия в контексте холста.

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

Кроме того, вы можете начать с нового MediaStream, хотя я сомневаюсь, что это имеет какое-либо влияние:

// assumes there is a 'canvas' and a 'mic_stream'

// make the context active, so the stream is not muted
const ctx = canvas.getContext("2d");
setInterval(() => ctx.clearRect(0,0,1,1), 500);
ctx.clearRect(0,0,1,1);
const canvas_stream = canvas.captureStream();

const canvas_track = canvas_stream.getVideoTracks()[0];
const mic_track = mic_stream.getAudioTracks()[0];
const merged_stream = new MediaStream([ canvas_track, mic_track ]);

// do something with 'merged_stream'
person Kaiido    schedule 22.01.2021