[Voice communications] 声道的转换

简介:

本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正!

很多粤语剧都提供了两个声道,一个左声道为粤语,一个右声道有国语。观看者可以自由切换声道,那么切换声道的原理是什么呢?在播放器中,只需要把不同的声道切换到声轨就行了,因为有左右两个声道,所以播放器至少是包含两个声轨的。如果我们想听粤语,只需要将右声道声轨的声音设置为 0,或者临时删掉右声道声轨。本文主要是利用 GainNode 节点控制音量的属性实现两个音轨之间的相互切换,Cross-fading 的意思可以在后面的 DEMO 中用耳朵体会出来~

本文地址:http://www.cnblogs.com/hustskyking/p/webAudio-cross-fading.html,转载请注明源地址。

P.S:请在较新版的 chrome 火狐 Firefox 中测试。

一、两个声音之间的声轨切换

1. 原理介绍

在一个 AudioContext 中可以输入多个音频流,而这些音频流在 AudioContext 这个环境中辗转反侧,最后的出路也就是 DestinationNode:

source 1 ---+

                        |----> Destination

source 2 ---+

而要实现上面两个声轨的切换,实则是它容易了,我们可以在他们到达 Destination 之前,加一个 GainNode,上文 已经对 GainNode 做了详细的说明,本文就不继续赘述了。

2. DEMO 演示

首先要创建两个音频,平时我们都是使用 audio 节点带上 src 属性,插入到 DOM 中让其自动播放音频,本文将使用其他的方式拿到音频流:

var tank = new Audio("http://qianduannotes.duapp.com/file/tankWar.mp3");

我准备了两个音频,一个是 tankWar.mp3 ,经典的坦克大战开场音乐,另一个是 SuperMario.mp3,超级玛丽的背景音乐,前者稍微短一些,所以在播放的时候将其设定为循环播放:

tank.loop = true;

然后利用 createMediaElementSource 这个函数从 Media 中获取到音频流:

var source1 = context.createMediaElementSource(tank);

过程十分简单,整个 AudioContext 的连接模型为:

source 1 --> GainNode 1 -+

                                                       |----> Destination

source 2 --> GainNode 2 -+

然后用同一个控制棒来控制 GainNode 1 和 2。

<input type="range" min="0" max="100" id="volume" />
<script type="text/javascript">
    var tank = new Audio("http://qianduannotes.duapp.com/file/tankWar.mp3");
    tank.loop = true;
    var mario = new Audio("http://qianduannotes.duapp.com/file/SuperMario.mp3");
    mario.loop = true;

    var AudioContext = AudioContext || webkitAudioContext;
    var context = new AudioContext();
    var source1 = context.createMediaElementSource(tank);
    var source2 = context.createMediaElementSource(mario);
    var gain1 = context.createGain();
    var gain2 = context.createGain();
    //连接:source → gain → destination
    source1.connect(gain1);
    source2.connect(gain2);
    gain1.connect(context.destination);
    gain2.connect(context.destination);
    //音量控制
    var value;
    onload = volume.onchange = function(){
      gain1.gain.value = volume.value / 100;
      gain2.gain.value = 1 - volume.value / 100;
    };

    tank.onload = mario.onlond = function(){
        console.log("var1, var2");
    }
    tank.play();
    mario.play();

</script>
运行代码

代码没有封装,写的稍微有些乱,不过看了之前的说明,应该可以理解这段代码~

3. 效果增强

上面的音量控制,我使用的是线性控制:

gain1.gain.value = volume.value / 100;
gain2.gain.value = 1 - volume.value / 100;

效果并不是特别好,他对音量的控制如下图:

稍微修改下控制函数:

var vol = volume.value / 100;
gain1.gain.value = Math.cos(vol * 0.5 * Math.PI);
gain2.gain.value = Math.cos((1.0 - vol) * 0.5 * Math.PI);

可以感受到音量的变化是这样的:

详情可以戳这个demo:http://qianduannotes.duapp.com/demo/audio/

二、小结

本文的目的是介绍 Web Audio API 的 GainNode 节点的使用,并将此应用到声道的切换之中,上面的例子不能算是严格的声道切换,但如果我们只给 volume 参数设定 0 ,50, 100 这三个值,那效果跟声道的切换就差不多了~

由于这几篇文章都是关于 Node 之间的相互连接,技术含量并不多,主要是读懂 API 以及相关使用方法。行文仓促,如有错误地方,还请斧正!

三、参考资料







本文转自Barret Lee博客园博客,原文链接:http://www.cnblogs.com/hustskyking/p/webAudio-cross-fading.html,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
机器学习/深度学习 JSON 供应链
1688图片搜索API(拍立淘)实操指南
1688图片搜索API(拍立淘/以图搜货)是官方图像搜品接口,支持图片URL或Base64输入,秒级返回同款/相似商品ID、标题、价格等结构化数据,精准高效,适用于反向海淘、供应链寻源、比价选品等场景。
1110 1
|
存储 安全 Java
ArrayList源码全面解析
ArrayList源码全面解析
|
Web App开发 前端开发 JavaScript
前端新利器:CSS容器查询——让组件真正“自适应
前端新利器:CSS容器查询——让组件真正“自适应
571 83
|
3月前
|
人工智能 开发框架 数据可视化
AI智能体(Agent)开发平台
主流AI智能体平台已形成清晰分层:Coze重易用与生态,Dify强开源与RAG,Copilot Studio深耕M365企业场景,LangFlow/Flowise专注可视化底层编排,千帆AgentBuilder则强化中文理解与本地化。选型需匹配业务节奏与技术深度。(239字)
|
3月前
|
人工智能 安全 数据可视化
不止是聊天!深度解析OpenClaw“养龙虾”:技能扩展与多Agent协作
本文围绕 OpenClaw “养龙虾” 展开,解析其技能扩展与多 Agent 协作机制。作为 LLM 执行中间层,它通过可插拔技能为 AI 拓展工具调用与操作能力,借助多智能体分工协作完成复杂任务。文章揭示 AI 从单纯对话向自主执行、协同工作演进的核心趋势,展现智能体工程化落地的关键路径。
1841 7
|
9月前
|
SQL 关系型数据库 MySQL
阿里云RDS云数据库全解析:产品功能、收费标准与活动参考
与云服务器ECS一样,关系型数据库RDS也是很多用户上云必买的热门云产品之一,阿里云的云数据库RDS主要包含RDS MySQL、RDS SQL Server、RDS PostgreSQL、RDS MariaDB等几个关系型数据库,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,帮助您解决数据库运维的烦恼。本文为大家介绍阿里云的云数据库 RDS主要产品及计费方式、收费标准以及活动等相关情况,以供参考。
|
安全 数据挖掘 BI
欢迎使用Quick BI,开启您的智能数据分析之旅!
欢迎选择Quick BI作为您的数据分析伙伴!本文将为您介绍一个月全功能免费试用教程,帮助您轻松上手。请确保在PC环境下操作。
1250 6
|
人工智能 供应链 搜索推荐
AI+电商API:智能推荐、动态定价与自动化运营的未来
在电商竞争日益激烈的今天,AI与电商API的深度融合正重塑行业格局。通过智能推荐、动态定价与自动化运营,AI+电商API助力企业精准洞察用户需求、优化价格策略、提升运营效率,推动个性化、高效能的智慧电商发展,为企业打开未来增长新空间。
|
开发框架 前端开发 JavaScript
React 框架的优点和缺点是什么?
React框架作为当前主流的前端开发框架之一,具有诸多优点,同时也存在一些缺点