2014-04-01 8 views
3

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

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

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

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

+0

Почему вы не используете параметр метаданных вызова peerjs для определения того, является ли его аудиовызов или видеовызов. Конечно, вы должны установить этот параметр при размещении вызова. – thunderbird

ответ

3

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

Согласно W3C WebRTC Spec, вы должны быть в состоянии сделать это:

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

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

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

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

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

Удачи вам!

+0

Спасибо за ваш ответ, не совсем то, что я хотел (мой плохой). См. Мой ответ выше для решения, которое работает для меня. По крайней мере на данный момент. Придется проводить дополнительные испытания. –

1

По факту: this blog post from Mozilla. Интересная часть начинается под заголовком «Отключение аудио- и видеопотоков». Здесь вы найдете следующую строку кода:

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

Это означает, что вы можете отключить видеодорожку. Как оказалось, то же самое можно сделать так:

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

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

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; 

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

+0

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