webRTC: добавить звук позже или отключить микрофон с помощью peerJS

В настоящее время я пишу приложение, которое позволяет пользователю начать видеозвонок через webRTC с использованием peerJS. Теперь я хочу, чтобы пользователи могли решать, хотят ли они добавить аудио или нет, но без перезапуска вызова.

Насколько я вижу - и согласно этот ответ - нет возможности управлять микрофоном с помощью браузера. Предположим, я начинаю вызов с включенным видео и аудио. Я могу отключить видеоэлемент на стороне партнеров. Я не хочу этого делать. Почему? Я предполагаю, что кто-то может использовать консоль разработчика браузера и включить элемент видео, таким образом шпионя за звонящим без его или ее ведома.

Так что на данный момент кажется, что мне придется повторно звонить партнеру и активировать как видео, так и аудио, теперь, если пользователь хочет только видео, мне придется снова звонить.

Мой вопрос: есть ли лучший способ сделать это? Кроме того, при ответе на вызов есть ли способ определить, является ли это только видео или видео и аудио вызовом?


person stiller_leser    schedule 01.04.2014    source источник
comment
почему бы вам не использовать параметр метаданных вызова peerjs, чтобы определить, является ли это аудиовызовом или видеовызовом. Конечно, вам придется установить этот параметр при совершении вызова.   -  person thunderbird    schedule 07.07.2015


Ответы (2)


Случайно я нашел эту запись в блоге от Mozilla. Самое интересное начинается под заголовком «Приглушение аудио- и видеопотоков». Здесь вы найдете следующую строку кода:

mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled);

В основном это означает, что вы можете отключить Video-Track. Как оказалось, то же самое возможно с:

mediaStream.getAudioTracks()[0].enabled = false;

Который отключит аудиопоток. Если это применяется к localStream следующим образом:

Participant.prototype.startCall = function(){

     var participant = this;

     var target = participant.callees[0];

     navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

     navigator.getUserMedia({
          audio: true,
          video: true
     },function(stream){
          console.log("called");
          //IMPORTANT LINE HERE
          stream.getAudioTracks()[0].enabled = false;
          participant.localStream = stream;
          participant.call = participant.peer.call(target, stream);
     },function(error){
          console.log(error);   
     });
};

кажется, отключает аудиопоток. Как видите, я сохраняю localStream как свойство своего объекта и позже могу активировать аудиопоток с помощью

myObj.localStream.getAudioTracks()[0].enabled = true;

Насколько я могу судить, вы не можете выполнить ту же операцию на удаленном потоке. Но мне придется проверить это путем дальнейшего тестирования.

person stiller_leser    schedule 01.04.2014
comment
Я переключаю звук в удаленном потоке, отправляя сообщения от подключенного узла, например enable-audio и disable-audio, а затем, соответственно, используя stream.getAudioTracks()[0].enabled. Я предполагаю, что звук не передается пирам, когда он отключен, но я пока не смог измерить передачу данных. - person Bert; 20.10.2016

Похоже, что вы ищете способ отозвать доступ к микрофону или веб-камере, чтобы поток данных прекратился, индикатор погас, и если камера повторно активируется, пользователю снова будет предложено.

В соответствии с W3C WebRTC Spec вы сможете сделать следующее:

Скрипт может указать, что дорожке больше не нужен источник, с помощью метода MediaStreamTrack.stop(). Когда все треки, использующие источник, были остановлены, данное разрешение для этого источника отменяется, и источник останавливается. Если данные генерируются из живого источника (например, микрофона или камеры), тогда пользовательский агент должен удалить любой активный индикатор «в эфире» для этого источника.

В документах по PeerJS API метод stop() не упоминается, но вы должны иметь возможность вызовите его в реализации WebRTC браузера, используя поток, который вы передаете функции call() peerJS, которую я назову stream:

var s = function(t) {
    t.stop();
}
stream.getAudioTracks().map(s);

Это должно привести к тому, что браузер отменит доступ к аудио.

Однако я бы не слишком беспокоился о безопасности оставления открытого соединения WebRTC в браузере пользователя. Если кто-то смог взломать браузер, у него уже будет доступ к незашифрованным паролям пользователя, а индикатор камеры (если есть) будет гореть в любом случае.

Удачи!

person drnugent    schedule 01.04.2014
comment
Спасибо за ваш ответ, это было не совсем то, что я хотел (мой плохой). Смотрите мой ответ выше для решения, которое работает для меня. По крайней мере на данный момент. Придется делать дополнительные тесты. - person stiller_leser; 01.04.2014