Javascript 在AudioContext中处理后,无法听到来自RTPeerConnection的音频

Javascript 在AudioContext中处理后,无法听到来自RTPeerConnection的音频,javascript,google-chrome,webrtc,web-audio-api,Javascript,Google Chrome,Webrtc,Web Audio Api,我有活动的rtpeerconnection。我想处理这个音频。我正在创建newaudiocontext()然后创建新节点:MediaStreamAudioSourceNode到MediaStreamAudioDestinationNode 将MediaStreamAudioSourceNode连接到MediaStreamAudioDestinationNode后,我听不到音频 MediaStreamAudioDestinationNode连接到Audio元素 我尝试过将MediaStream从

我有活动的
rtpeerconnection
。我想处理这个音频。我正在创建
newaudiocontext()
然后创建新节点:
MediaStreamAudioSourceNode
MediaStreamAudioDestinationNode

MediaStreamAudioSourceNode
连接到
MediaStreamAudioDestinationNode
后,我听不到音频

MediaStreamAudioDestinationNode
连接到
Audio
元素

  • 我尝试过将
    MediaStream
    rtpeerconnection
    直接连接到
    Audio
    ,效果很好

  • 我还尝试将MediaStreamAudioSourceNode.mediaStream连接到
    Audio
    元素,它也可以工作

  • 我已经连接了由
    getUserMedia()
    返回的
    MediaStream
    ,它甚至可以与
    MediaStreamAudioDestinationNode

看来只有来自
rtpeerconnection
MediaStream
不能与
MediaStreamAudioDestinationNode
一起使用

功能播放(EventWebRTPeerConnection){
const audio=新音频()
const ctx=新的AudioContext();
让mediaStream=新的mediaStream();
EventWebRTPeerConnection.streams[0].getAudioTracks().forEach(track=>mediaStream.addTrack(track));
//创建源和目标并连接它们
const msSource=ctx.createMediaStreamSource(mediaStream);
const msDestination=ctx.createMediaStreamDestination();
msSource.connect(msDestination);
//在音频对象上播放媒体流
audio.srcObject=msDestination.stream;//不工作
//audio.srcObject=msSource.mediaStream;//有效
audio.oncanplay=async()=>{
audio.muted=false;
等待音频。播放();
}
}

我希望在连接
MediaStreamAudioSourceNode
MediaStreamAudioDestinationNode

后能听到音频。有点令人困惑的答案是,至少Chrome要求您将来自WebRTC连接的MediaStream直接连接到音频元素。我不确定这是一个bug还是一个特性。好消息是,您可以将此音频元素静音。您的代码将如下所示:

const mutedAudio = new Audio();
const outputAudio = new Audio();
const context = new AudioContext();
const mediaStream = new MediaStream();

peerConnection.streams[0].getAudioTracks().forEach(track => mediaStream.addTrack(track));

mutedAudio.muted = true;
mutedAudio.srcObject = mediaStream;
mutedAudio.play();

const source = context.createMediaStreamSource(mediaStream);
const destination = context.createMediaStreamDestination();

source.connect(destination);

outputAudio.muted = false;
outputAudio.srcObject = msDestination.stream;
outputAudio.play();

您也可以跳过
outputAudio
元素,将
直接连接到
上下文
目标
,这是一个已知的问题。您是否有一个链接来解释此限制背后的原理?你的回答使我不想知道为什么这不起作用。这是这个问题的最佳解决方法吗?这个问题至少间接地提到了这个问题:我不知道还有其他的解决方法。哇。谢谢@chrisguttandin。你救了我一整晚!