gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:22:45 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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);

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

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

引用

关于javascript - 通过 PeerConnection 发送带有 Web 音频效果的 MediaStream 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com