7

我知道 html5 音频的东西都是非常新的,但是有没有办法改变声音的左/右平衡?

像这样的东西:

var snd = new Audio("test.mp3");
snd.balance = -1; // only left
snd.play();
4

2 回答 2

7

这可以使用音频 Web API

<audio>元素是一个非常基本的工具,只允许您播放/暂停播放和更改音量。如果您需要更复杂的操作,则需要使用Audio Web API

Audio Web API 的工作方式是构建一个连接在一起的节点图/链。一方面,你有你的音频源——它可以是一个音频文件或你生成的一些音频波。另一方面,您有您的音频目的地(音频接收器),它将是您的计算机扬声器/耳机。在中间,您可以放置​​任意数量的节点来操作音频。例如,您可以使用GainNode来控制音量,也可以使用SterioPannerNode来控制左右平衡。

API 非常复杂,但仅控制左右平衡非常简单:

第 1 步 - 加载音频源

首先,让我们创建一个<audio>元素,以便我们可以加载声音。如果您通过 XHR 请求加载音频,或者在运行时生成声音,则不必使用该元素。<audio>

<audio src="myCoolTrack.mp3"></audio>

第 2 步 - 音频上下文

让我们创建一个AudioContext并将音频从元素加载到上下文对象

// for legacy browsers
const AudioContext = window.AudioContext || window.webkitAudioContext;

const audioContext = new AudioContext();

// get the audio element
const audioElement = document.querySelector('audio');

// pass it into the audio context
const track = audioContext.createMediaElementSource(audioElement);

步骤 3 立体节点

让我们创建一个StereoPannerNode控制平衡的

// default pan set to 0 - center
const stereoNode = new StereoPannerNode(audioContext, { pan: 0 });

// change the value of the balance by updating the pan value
stereoNode.pan.value = -1; // left
stereoNode.pan.value = 0; // center
stereoNode.pan.value = 1; // right

最后一步

将所有节点连接到单个图/链。带有输入节点(音频源)和输出节点(扬声器/耳机)。您可以在中间添加更多节点以进行其他音频操作,例如音量、过滤等。

track.connect(stereoNode).connect(audioContext.destination);

补充阅读

附加示例

这个答案使用StereoPannerNode单个控制平衡的AudioNode。但是如果你想分割你的音频并分别操纵每个通道(左/右),你需要ChannelSplitterNodeChannelMergerNode. 您可以在此处找到有关如何使用它们的完整示例:https ://stackoverflow.com/a/63272648/2658683

于 2020-07-31T14:17:18.950 回答
3

As of 2021, this is possible using the Web Audio API. See this answer for more info.


Original answer:

Currently, this is not supported.

You can check the w3c spec for supported properties and methods. Note that browsers often provide more / less or different things. But in this case: no browser supports audio balance changes.

http://dev.w3.org/html5/spec/Overview.html#audio

于 2011-02-26T09:44:34.013 回答