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。你救了我一整晚!