web audio 之 多轨语音播放


最近学习了下 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 复位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现高仿微信语音播放效果可以通过以下步骤实现: 1. 创建一个 audio 元素,并设置其 src 属性为音频的 URL。 ``` <audio src="audio.mp3" preload="auto"></audio> ``` 2. 为 audio 元素添加播放和暂停事件。 ``` var audio = new Audio('audio.mp3'); audio.addEventListener('play', function () { // 播放时触发的事件 }); audio.addEventListener('pause', function () { // 暂停时触发的事件 }); ``` 3. 创建一个 div 元素,用于显示语音播放动画。 ``` <div class="voice"> <div class="voice-icon"> <i class="icon-voice"></i> </div> <div class="voice-animation"> <span></span> <span></span> <span></span> </div> </div> ``` 4. 为 div 元素添加点击事件,点击时播放音频并显示动画。 ``` var voice = document.querySelector('.voice'); voice.addEventListener('click', function () { audio.play(); showAnimation(); }); ``` 5. 显示语音播放动画。 ``` function showAnimation() { var animation = voice.querySelector('.voice-animation'); var spans = animation.querySelectorAll('span'); animation.classList.add('voice-animation-active'); for (var i = 0; i < spans.length; i++) { spans[i].style.animationDelay = (i * 0.1) + 's'; } } ``` 6. 隐藏语音播放动画。 ``` function hideAnimation() { var animation = voice.querySelector('.voice-animation'); animation.classList.remove('voice-animation-active'); } ``` 7. 监听音频的播放和暂停事件,根据事件改变动画的状态。 ``` audio.addEventListener('play', function () { showAnimation(); }); audio.addEventListener('pause', function () { hideAnimation(); }); ``` 8. 最后,通过 CSS 样式修改动画的样式。 ``` .voice-animation { display: flex; justify-content: center; align-items: center; height: 30px; margin-top: 4px; } .voice-animation span { display: inline-block; width: 6px; height: 100%; margin-right: 4px; background-color: #4e4e4e; animation: voice-animation 0.6s infinite; } @keyframes voice-animation { 0% { height: 30px; } 50% { height: 20px; } 100% { height: 30px; } } .voice-animation-active span { animation: none; background-color: #1aad19; } ``` 通过以上步骤,可以实现一个高仿微信语音播放效果的音频播放器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值