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

时间:2014-10-17 18:35:46

标签: javascript html5 webrtc web-audio

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

我从getUserMedia()方法获取音频和视频。我遇到的问题是如何将这个流对象(包括音频和视频)传递给这些方法(例如:createMediaStreamSource())?我是否首先需要以某种方式从流中提取音频(getAudioTracks)并找到将其与视频组合的方法?或者我按原样传递它并使视频不受影响?音频只能改变一次(在添加到PeerConnection之前)吗?

2 个答案:

答案 0 :(得分:5)

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

var source = context.createMediaStreamSource(localStream);

其中“context”在上面的代码中是AudioContext对象,“localStream”是从getUserMedia()获得的MediaStream对象。 createMediaStreamDestination()方法创建一个目标节点对象,该对象在其“stream”属性中具有MediaStream对象。此MediaStream对象仅包含一个AudioMediaStreamTrack(即使源的输入流包含音频和视频或众多音频轨道):从源中的流获取的轨道的更改版本。例如:

var destination = context.createMediaStreamDestination();

现在,在您可以访问新创建的目标变量的stream属性之前,必须通过将所有节点链接在一起来创建音频图。对于此示例,假设我们有一个名为filter的BiquadFilter节点:

source.connect(filter);
filter.connect(destination);

然后,我们可以从目标变量中获取stream属性。这可以用于添加到PeerConnection对象以发送到远程对等方:

peerConnection.addStream(destination.stream);

注意:stream属性包含仅具有已更改的AudioMediaStreamTrack的MediaStream对象。因此,没有视频。如果您还想要发送视频,则必须将此曲目添加到包含视频曲目的流对象中:

var audioTracks = destination.stream.getAudioTracks();
var track = audioTracks[0]; //stream only contains one audio track
localStream.addTrack(track);
peerConnection.addStream(localStream);

请记住,如果MediaStream对象中已有一个具有相同ID的跟踪,addTrack方法将不会添加该跟踪。因此,您可能必须先删除在源节点中获取的轨道。

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

<强>参考

答案 1 :(得分:2)

@Android学生的反应很好,按照目前的规格 - 然而,在规范的实施中,Firefox和Chrome都存在问题。

最后我在Chrome中检查过,它无法通过WebAudio处理WebRTC的输出,而Firefox可以。

但是,有两个错误阻止Firefox在PeerConnection中获取WebAudio生成的源流,其中一个现已在Nightly&amp; amp;极光,其他应该很快。 Firefox尚未实现stream.addTrack,但这是另一个复杂因素。 Chrome显然可以处理PeerConnection中的WebAudio源流。