ToneJS PitchShift 与 MediaStream

问题描述 投票:0回答:1

我目前正在构建一个具有变调功能的应用程序,我发现 ToneJS 可以完成这项工作。我想知道是否可以从媒体流中仅提取音轨的音高偏移部分。

const audioContext = new Tone.Context();
Tone.setContext(audioContext);

const mediaStreamSource = audioContext.createMediaStreamSource(
  new MediaStream([localMicrophoneTrack.getMediaStreamTrack()]),
);
const gainNode = new Tone.Gain();
const pitchShift = new Tone.PitchShift({ windowSize: 0.03, pitch: 6 });
const dstNode = audioContext.createMediaStreamDestination();

Tone.connect(mediaStreamSource, gainNode);
Tone.connect(gainNode, pitchShift);
Tone.connect(pitchShift, dstNode);

const track = dstNode.stream.getAudioTracks()[0];

当我进一步将轨道实例传递给远程用户时,我会在一段延迟后听到原始轨道和音高变换部分的混合声。

如有任何帮助,我们将不胜感激。预先感谢。

web-audio-api audio-processing mediastream pitch-shifting tonejs
1个回答
0
投票

如果我正确理解了你的代码部分,它应该转换为如下所示: const mediaStreamSource = new Tone.UserMedia(); const GainNode = new Tone.Gain(10); //你可以不加任何值,但我把它留在这里是为了让代码更简单

const pitchShift = new Tone.PitchShift({ windowSize: 0.03, pitch: 6 });

mediaStreamSource.open()

mediaStreamSource.chain(gainNode, pitchShift, new Tone.Mono(), Tone.Destination);

Tone.start()

请注意,Tone.UserMedia 只是 MediaStream 的包装器,以便更容易在 Tone.js 中使用(您可以在here清楚地看到它)。 Tone.ToneAudioNode.chain 方法执行您在代码中尝试执行的操作:它将节点的输出连接到下一个节点,并对提供的所有节点执行此操作。 Tone.UserMedia.open 方法请求 MediaStream 并将其作为 Tone.ToneAudioNode 返回。如果您有更多问题,可以阅读docs或随时提问。

© www.soinside.com 2019 - 2024. All rights reserved.