Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过PeerConnection发送具有Web音频效果的MediaStream对象_Javascript_Html_Webrtc_Web Audio Api - Fatal编程技术网

Javascript 通过PeerConnection发送具有Web音频效果的MediaStream对象

Javascript 通过PeerConnection发送具有Web音频效果的MediaStream对象,javascript,html,webrtc,web-audio-api,Javascript,Html,Webrtc,Web Audio Api,我正在尝试通过WebRTC的PeerConnection发送音频,该音频由getUserMedia()获取,并通过Web音频API进行更改。Web音频API和WebRTC似乎有能力做到这一点,但我很难理解如何做到这一点。在Web Audio API中,AudioContext对象包含一个方法createMediaStreamSource(),该方法提供了连接getUserMedia()获得的媒体流的方法。另外,还有一个createMediaStreamDestination()方法,它似乎返回一

我正在尝试通过WebRTC的PeerConnection发送音频,该音频由
getUserMedia()
获取,并通过Web音频API进行更改。Web音频API和WebRTC似乎有能力做到这一点,但我很难理解如何做到这一点。在Web Audio API中,
AudioContext
对象包含一个方法
createMediaStreamSource()
,该方法提供了连接getUserMedia()获得的媒体流的方法。另外,还有一个
createMediaStreamDestination()
方法,它似乎返回一个具有流属性的对象


我从getUserMedia()方法获取音频和视频。我遇到的问题是如何将这个流对象(包括音频和视频)传递到这些方法(例如:createMediaStreamSource())中?我是否首先需要从流中提取音频(getAudioTracks)并找到一种方法将其与视频结合起来?还是我按原样传递它,而它不影响视频?音频只能更改一次(在添加到PeerConnection之前)?

方法将
createMediaStreamSource()
对象作为其参数,然后将该对象的第一个
AudioMediaStreamTrack
用作音频源。这可以用于从
getUserMedia()
方法接收的MediaStream对象,即使该对象同时包含音频和视频。例如:

var source = context.createMediaStreamSource(localStream);
var destination = context.createMediaStreamDestination();
其中,在上述代码中,“context”是一个
AudioContext
对象,“localStream”是一个从getUserMedia()获得的MediaStream对象。
createMediaStreamDestination()
方法创建一个目标节点对象,其“stream”属性中包含一个MediaStream对象。此MediaStream对象仅包含一个AudioMediaStreamTrack(即使到源的输入流包含音频和视频或多个音频曲目):从源中的流获得的曲目的更改版本。例如:

var source = context.createMediaStreamSource(localStream);
var destination = context.createMediaStreamDestination();
现在,在访问新创建的目标变量的stream属性之前,必须通过将所有节点链接在一起来创建音频图。对于本例,假设我们有一个名为filter的BiquadFilter节点:

source.connect(filter);
filter.connect(destination);
然后,我们可以从目标变量获得stream属性。这可用于添加到
PeerConnection
对象以发送到远程对等方:

peerConnection.addStream(destination.stream);
注意:stream属性包含一个MediaStream对象,该对象仅包含修改后的AudioMediaStreamTrack。因此,没有视频。如果还希望发送视频,则必须将此曲目添加到包含视频曲目的流对象中:

var audioTracks = destination.stream.getAudioTracks();
var track = audioTracks[0]; //stream only contains one audio track
localStream.addTrack(track);
peerConnection.addStream(localStream);
请记住,如果MediaStream对象中已有一个具有相同id的曲目,则
addTrack
方法不会添加该曲目。因此,您可能必须首先删除在源节点中获得的曲目

通过调整中间节点(源节点和目标节点之间)内的值,可以随时更改声音。这是因为流在发送到另一个对等方之前通过了节点。动态更改录制声音的效果(对于流应相同)。注意:我还没有测试这段代码。虽然它在理论上是可行的,但可能存在一些跨浏览器问题,因为Web音频API和WebRTC都处于工作草案阶段,尚未标准化。我假设它可以在Mozilla Firefox和Google Chrome中工作

参考


@根据当前的规范,Android Student的响应良好-但是,在规范的实施过程中,Firefox和Chrome都存在问题

上次我登录Chrome时,它无法通过WebAudio处理WebRTC的输出,而Firefox可以


然而,有两个bug阻止Firefox在PeerConnection中获取WebAudio生成的源流,其中一个已经在Nightly&Aurora中修复,另一个应该很快就会修复。然而,Firefox还没有实现stream.addTrack,这是另一个复杂问题。Chrome显然可以在PeerConnection中处理来自WebAudio的流。

根据W3C的工作草案,createMediaStreamSource()接受一个MediaStream对象,来自该对象的第一个AudioMediaStreamTrack将用作音频源。但是,createMediaStreamDestination()方法表示只有一个AudioMediaStreamTrack的MediaStream对象。我会做更多的研究,并希望能提供一个答案。我提供的代码似乎在Chrome中工作,但是,关于Firefox尚未实现stream.addTrack,你是对的。我试图找到一个解决办法,但似乎不太可能。希望更多的MediaStream API方法很快就能在Firefox中实现。