【问题标题】:WebRTC: Is it possible to control the microphone and volume levelsWebRTC:是否可以控制麦克风和音量级别
【发布时间】:2013-06-05 14:35:54
【问题描述】:

我正在开发一个演示站点,其中包含一个允许用户拨打电话的滑出式小部件。

我正在使用 SIPml5 工具和 webrtc2sip 后端来处理呼叫。该部分已全部设置并正常工作。所以现在我正在研究是否可以使用小部件中的滑块来控制麦克风和音量。这甚至可能吗?我在网上到处找,运气不太好。

我确实找到了几个网站,它们向我展示了如何在 jQuery 滑块代码中控制音频标签的音量。所以我尝试像下面的代码一样设置它:

$(function() {
        $( "#slider-spkr" ).slider({
          orientation: "vertical",
          range: "min",
          min: 0,
          max: 100,
          value: 60,
          slide: function( event, ui ) {
            var value = $("#slider-spkr").slider("value");
            document.getElementById("audio_remote").volume = (value / 100);
          },
          change: function() {
            var value = $("#slider-spkr").slider("value");
            document.getElementById("audio_remote").volume = (value / 100);
          }
        });
    });

不幸的是,这也不起作用。所以我不确定在使用 SIPml5 时是否允许我这样做,或者我的 jQuery 代码是否需要调整。

有没有其他人在添加麦克风/音量控制方面有运气?感谢您的帮助。

【问题讨论】:

  • 如果audio_remote 元素是<audio> 元素,那应该可以。但是,一些平台(如 iOS)明确禁止设置 volume。至于设置麦克风响度,我认为这不是一件容易的事——也许你可以使用新的Web Audio API(在 Chrome 中,很快 FF)。
  • 你是对的。我做了一些更多的测试,我发布的 jQuery 代码现在可以用于该卷。不知道为什么它没有早点工作。我将看一下 Web Audio API。谢谢。
  • 体积已被提议为约束:dev.w3.org/2011/webrtc/editor/…,在此声明提议:dev.w3.org/2011/webrtc/editor/…。 (我知道这并不能解决您的问题或回答您的问题!)
  • 这个项目显然可以做到:github.com/HenrikJoreteg/mediastream-gain 但我无法让它在 chrome 30 上工作......

标签: javascript jquery webrtc


【解决方案1】:

Afaik 无法调节麦克风音量。但是您可以使用流 api 将其打开/关闭:

function toggleMic(stream) { // stream is your local WebRTC stream
  var audioTracks = stream.getAudioTracks();
  for (var i = 0, l = audioTracks.length; i < l; i++) {
    audioTracks[i].enabled = !audioTracks[i].enabled;
  }
}

此代码适用于本机 webrtc api,而不是 sipML5。他们似乎还没有实施它。 Here is 收据不太清楚。

【讨论】:

  • 再次感谢您的帮助。幸运的是,他们对麦克风静音和取消静音功能感到满意。
  • 如果 audioTrack 已经启用,这似乎会禁用它。这可能是更好的方法:if (!audioTracks[i].enabled) { audioTracks[i].enabled = true; }
  • @jesal:嗯,你是对的——就一致性而言,这种方法很糟糕。我宁愿定义一个布尔变量并切换它的值,然后将所有启用音轨的属性分配给这个变量。
【解决方案2】:

这是可能的,但目前仅在 Chrome 中并且有一些假设。 我不是作者,您可以在这个开源库 (SimpleWebRtc) 中找到此代码的灵感。

navigator.webkitGetUserMedia(constraints, 
    function(webRTCStream){
        var context = new window.AudioContext();
        var microphone = context.createMediaStreamSource(webRTCStream);
        var gainFilter = context.createGain();
        var destination = context.createMediaStreamDestination();
        var outputStream = destination.stream;
        microphone.connect(gainFilter);
        gainFilter.connect(destination);
        var filteredTrack = outputStream.getAudioTracks()[0];
        webRTCStream.addTrack(filteredTrack);
        var originalTrack = webRTCStream.getAudioTracks()[0];
        webRTCStream.removeTrack(originalTrack);
    },
    function(err) {
        console.log("The following error occured: " + err);
      }
 );

诀窍是修改流,然后将当前流的音轨替换为修改后的流的音轨(取自 MediaStreamDestination 流)。

免责声明:

这在 35 版的 FireFox 中不起作用,因为它们只是没有实现 MediaStream.addTrack/removeTrack。我目前使用此检查

  this.micVolumeIsSupported = function() {
    var MediaStream = window.webkitMediaStream || window.MediaStream;
    return !!MediaStream.prototype.addTrack && !!MediaStream.prototype.removeTrack;
  };
_gainSupported = this.micVolumeIsSupported();

这在 Chrome 中有一个限制,因为 bug 会停止流并混合轨道。您可能希望在关闭连接或连接中断之前恢复这些轨道;

this.restoreTracks = function(){
  if(_gainSupported && _tracksSubstituted){
    webRTCStream.addTrack(originalTrack);
    webRTCStream.removeTrack(filteredTrack);
    _tracksSubstituted = false;
  }
};

这对我有用

【讨论】:

  • 您可能希望在 BugZilla 上跟踪 FireFox 问题。随意投票支持功能实现:) 他们似乎并没有快速使用 webRtc 的这些要素。
  • 嗨,关于这个错误的任何进展......是否有可能从今天开始获取有关用户系统音量的信息,增加减少系统音量?
  • @SagarPilkhwal,我不相信可以通过浏览器调整系统音量。那是安全漏洞。然而,关于此处讨论的页面的音频级别,据我所知,Mozilla 最近在音频 API 方面取得了很大进步,并实现了添加/删除音轨
  • 谢谢,还有没有办法通过javascript获取系统卷信息?对吗?
  • @SagarPilkhwal,你可以阅读更多here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多