createMediaStreamSource()
方法以MediaStream
对象为参数,然后将该对象的第一个AudioMediaStreamTrack
作为音频源使用。即使该对象同时包含音频和视频,也可以使用从getUserMedia()
方法收到的MediaStream对象。例如:
var source = context.createMediaStreamSource(localStream);
在哪里“上下文”,在上面的代码,是一种AudioContext
对象和“localStream”是()从getUserMedia获得的MediaStream对象。 createMediaStreamDestination()
方法创建一个目标节点对象,该目标节点对象在其“流”属性中具有MediaStream对象。此MediaStream对象只包含一个AudioMediaStreamTrack(即使源的输入流同时包含音频和视频或众多音频轨道):从源内的流获取的轨道的更改版本。例如:
var destination = context.createMediaStreamDestination();
现在,然后才能访问新创建的目标变量的流属性,必须通过所有节点连接在一起创建音频图。对于这个例子,让我们假设我们有一个BiquadFilter节点命名滤波器:
source.connect(filter);
filter.connect(destination);
然后,我们可以得到从目的地可变流属性。而这可以用来添加到PeerConnection
对象发送到远程对等:
peerConnection.addStream(destination.stream);
注:流属性包含只有改变AudioMediaStreamTrack一个MediaStream对象。因此,没有视频。如果你想视频一并发送,你必须这条赛道添加到包含一个视频轨道流对象:
var audioTracks = destination.stream.getAudioTracks();
var track = audioTracks[0]; //stream only contains one audio track
localStream.addTrack(track);
peerConnection.addStream(localStream);
请记住,如果有该addTrack
方法将不添加轨道已经在MediaStream对象中具有相同的ID。因此,您可能必须首先删除源节点中获取的曲目。
声音应该可以随时通过调整中间节点(源和目标之间)的值来改变。这是因为流在发送到其他对等体之前通过节点。 Check out this example动态改变录制声音的效果(对于流应该是相同的)。注意:我还没有测试过这个代码。虽然它在理论上有效,但由于Web Audio API和WebRTC都处于工作草案阶段并且尚未标准化,因此可能存在一些跨浏览器问题。我认为它可以在Mozilla Firefox和Google Chrome中运行。
参考
根据W3C的工作草案,createMediaStreamSource()需要一个MediaStream对象,并且此对象的第一个AudioMediaStreamTrack将用作音频源。但是,createMediaStreamDestination()方法表示只有一个AudioMediaStreamTrack的MediaStream对象。我会做更多的研究,并希望提供一个答案。 – chRyNaN 2014-10-18 01:10:50