【问题标题】:Chrome won't play WebAudio getUserMedia via WebRTC/Peer.jsChrome 不会通过 WebRTC/Peer.js 播放 WebAudio getUserMedia
【发布时间】:2020-05-12 02:25:06
【问题描述】:

我想使用 Peer.js 在 WebRTC 上制作一个简单的纯音频流。我在本地运行简单的 PeerServer。

以下内容在 Firefox 30 中运行良好,但我无法在 Chrome 35 中运行。我预计 PeerJS 设置有问题,但 Chrome -> Firefox 工作得非常好,而 Chrome -> Chrome 似乎发送流,但不会通过扬声器播放。

设置 getUserMedia 注意:取消注释下面的这些行会让我听到 Chrome 和 Firefox 中的环回。

navigator.getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
window.AudioContext = window.AudioContext || window.webkitAudioContext;

if(navigator.getUserMedia) {
    navigator.getUserMedia({video: false, audio: true}, getMediaSuccess, getMediaError);
} else {
    alert('getUserMedia not supported.');
}

var localMediaStream;
//var audioContext = new AudioContext();

function getMediaSuccess(mediaStream) {
    //var microphone = audioContext.createMediaStreamSource(mediaStream);
    //microphone.connect(audioContext.destination);
    localMediaStream = mediaStream;
}

function getMediaError(err) {
    alert('getUserMedia error. See console.');
    console.error(err);
}

建立连接

var peer = new Peer({host: '192.168.1.129', port: 9000});

peer.on('open', function(id) {
    console.log('My ID:', id);
});

peer.on('call', function(call) {
    console.log('answering call with', localMediaStream);
    call.answer(localMediaStream);
    //THIS WORKS IN CHROME, localMediaStream exists

    call.on('stream', function(stream) {
        console.log('streamRecieved', stream);
        //THIS WORKS IN CHROME, the stream has come through

        var audioContext = new AudioContext();
        var audioStream = audioContext.createMediaStreamSource(stream);
        audioStream.connect(audioContext.destination);
        //I HEAR AUDIO IN FIREFOX, BUT NOT CHROME

    });

    call.on('error', function(err) {
        console.log(err);
        //LOGS NO ERRORS
    });
});

function connect(id) {
    var voiceStream = peer.call(id, localMediaStream);
}

【问题讨论】:

  • 如果将AudioContext() 更改为webkitAudioContext() 会怎样?只是在黑暗中拍摄,因为应该没有真正的区别。
  • 试过了,没区别。我认为第一部分的第 2 行无论如何都会解决这个问题。
  • 你是对的......这是一个有趣的困境。

标签: javascript google-chrome firefox webrtc peerjs


【解决方案1】:

即使在 Chrome 73 中,这似乎仍然是一个问题。

现在拯救我的解决方案是将媒体流连接到静音的 HTML 音频元素。这似乎使流工作并且音频开始流入 WebAudio 节点。

这看起来像:

let a = new Audio();
a.muted = true;
a.srcObject = stream;
a.addEventListener('canplaythrough', () => {
    a = null;
});

let audioStream = audioContext.createMediaStreamSource(stream);
audioStream.connect(audioContext.destination);

JSFiddle:https://jsfiddle.net/jmcker/4naq5ozc/


原始 Chromium 问题和解决方法: https://bugs.chromium.org/p/chromium/issues/detail?id=121673#c121

新的 Chromium 问题:https://bugs.chromium.org/p/chromium/issues/detail?id=687574 https://bugs.chromium.org/p/chromium/issues/detail?id=933677

【讨论】:

【解决方案2】:

在 Chrome 中,它是 known bug,目前无法通过 AudioAPI 访问从对等连接收集的远程音频流。

关于该错误的最新评论:

我们正在努力实现该功能。之所以这样 需要很长时间是我们需要先将APM移动到chrome, 实现一个渲染混合器来从 WebRtc 获取未混合的数据,然后我们 可以将远程音频流连接到 webaudio。

它最近在 Firefox 中进行了修补,因为我记得这在过去也是一个问题。

【讨论】:

  • 半年过去了,在 Chrome M40 上仍然失败
  • @Imskull,太糟糕了。刚刚检查了错误报告,Justin Uberti 说他们只完成了大约四分之一的工作,并且一直在努力/将修复它的团队目前正在处理其他问题。根据我的阅读,这是一个非常严重的设计缺陷,而不仅仅是一个编码错误。
  • 是的,谷歌在任何地方都提倡 webrtc 似乎很奇怪,但没有得到这个问题的修复 3 年。引擎盖下有些东西。
  • solved 于 2015 年 12 月在 Chrome Canary 中使用
【解决方案3】:

我无法使用网络音频播放流,但我确实设法使用基本音频元素播放它:

 var audio = new Audio();                                                  
 audio.src = (URL || webkitURL || mozURL).createObjectURL(remoteStream);
 audio.play();

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多