最近学习了下 web audio 觉得很有意思,这里和大家分享下

web audio可以实现的功能

web audio 可以对语音文件的音轨进行分割,区分出左右声道,从而单独播放 两个音轨的语音

实例分享

这里将web audio和audio标签进行结合使用,从 audio标签中获取 mediaSource,进行声音的处理。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Audio</title>
  </head>
  <body>
    <audio
      controls
      id="audio"
      crossorigin="anonymous"	//audio标签 添加 该属性 允许跨域
      src=""
    ></audio>

    L<input type="range" min="0" max="200" value="100" id="equalizer" />R
    <script>
      var AudioContext =
          AudioContext ||
          webkitAudioContext, // 兼容性
        context = new AudioContext(), // 创建Audio上下文
        audio = document.getElementById("audio");
      var media = context.createMediaElementSource(audio), // 从元素获取音源
        lGain = context.createGain(), // 左声道
        rGain = context.createGain(), // 右声道
        splitter = context.createChannelSplitter(2), // 创建分离器:这里最多可以有6个通道
        merger = context.createChannelMerger(2), // 创建 合成器
        vol = 100, // 音量
        lVol = 100, // 左声道
        rVol = 100; // 右声道
      lGain.gain.value = 1;
      rGain.gain.value = 1;
      media.crossOrigin = "anonymous";	//这里解决跨域问题
	  //下面将 音源 与 各个节点 连接起来(下面的流程分析图)
      media.connect(splitter);	//音源连接到 分离器
      splitter.connect(lGain, 0);	//将分离器的 第0个通道给左声道
      splitter.connect(rGain, 1);	//将分离器的 第1个通道给右声道
      lGain.connect(merger, 0, 0);	//将左声道的第0个通道 给 合成器的第0个通道
      rGain.connect(merger, 0, 1);	//将右声道的第0个通道 给 合成器的第1个通道
      merger.connect(context.destination);//这里连接到 输出设备

      // 声道控制
      onloadequ = equalizer.onchange = function() {
        lVol = equalizer.value > 100 ? 100 : equalizer.value;
        rVol = equalizer.value < 100 ? 100 : 200 - equalizer.value;
        setVolume();
      };
      // 设置音量
      function setVolume() {
        lGain.gain.value = ((lVol / 100) * vol) / 100;
        rGain.gain.value = ((rVol / 100) * vol) / 100;
        context.resume();
      }
      audio.addEventListener("play", function() {
        //开始播放时触发
        context.resume();	//这里将 context 进行复位操作,否则不能进行播放
      });
    </script>
  </body>
</html>

流程分析

流程图

参考文档

splitter通道0
merger通道0
splitter通道1
merger通道1
media音源
splitter分离器
lGain左声道
merger合成器
rGain右声道
设备输出context.destination

流程总结

上面就是web audio 的普遍使用步骤

  1. 创建 创建音频上下文 context
  2. 获取 音源:media ,这里是通过 createMediaElementSource 方法从 audio标签中获取
  3. 创建各个节点,如:lGain ( 左声道)、rGain ( 右声道)、splitter ( 分离器)、merger (合成器 )、
  4. 将各节点 connect
  5. 播放语音 audio.paly()

注意事项

  1. audio 标签中的语音需要从服务器获取,切该接口必须支持跨域(Access-Control-Allow-Origin: * )
  2. chrome 浏览器不支持语音的自动播放,需要通过 按钮触发播放
  3. audio 标签和 web audio 一起使用的时候,点击标签的播放按钮会报错,需要添加 context.resume() 方法,将context 复位
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐