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

2024-01-20

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

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


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

var source = context.createMediaStreamSource(localStream);

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

var destination = context.createMediaStreamDestination();

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

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

然后,我们可以从目标变量中获取流属性。这可以用来添加到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);

请记住,addTrack如果 MediaStream 对象中已经存在具有相同 id 的曲目,则该方法将不会添加该曲目。因此,您可能必须首先删除在源节点中获取的轨迹。

声音应该能够随时通过调整中间节点(源和目标之间)内的值来改变。这是因为流在发送到另一个对等点之前会经过节点。看看这个例子 https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_Web_Audio_API动态改变录制声音的效果(对于流应该是相同的)。注意:我还没有测试过这段代码。尽管理论上可行,但由于 Web Audio API 和 WebRTC 均处于工作草案阶段且尚未标准化,因此可能存在一些跨浏览器问题。我假设它可以在 Mozilla Firefox 和 Google Chrome 中工作。

参考

  • 媒体捕获和流媒体 http://w3c.github.io/mediacapture-main/getusermedia.html#mediastream
  • 网络音频API http://webaudio.github.io/web-audio-api/#the-mediastreamaudiosourcenode-interface
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 PeerConnection 发送具有 Web 音频效果的 MediaStream 对象 的相关文章

随机推荐