2014-10-17 87 views
2

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

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

+0

根据W3C的工作草案,createMediaStreamSource()需要一个MediaStream对象,并且此对象的第一个AudioMediaStreamTrack将用作音频源。但是,createMediaStreamDestination()方法表示只有一个AudioMediaStreamTrack的MediaStream对象。我会做更多的研究,并希望提供一个答案。 – chRyNaN 2014-10-18 01:10:50

回答

3

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中运行。

参考

2

@android学生的反应良好,按照目前的规格 - 但是,也有在执行与Firefox和Chrome的问题规格。

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

但是,有两个漏洞阻止Firefox在PeerConnection中使用WebAudio生成的源码流,其中一个现在已经在Nightly & Aurora中修复,另一个应该很快。但是,Firefox尚未实现stream.addTrack,这是另一个复杂因素。 Chrome显然可以处理PeerConnection中的WebAudio源流。

+0

我提供的代码似乎在Chrome中工作,但是,您对Firefox尚未实现stream.addTrack的说法是正确的。我试图找到解决方法,但似乎不太可能。希望更多MediaStream API方法的实现将很快在Firefox中提供。 – chRyNaN 2014-10-22 15:47:08