Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >超动感音乐可视化:WebAudio与Shader的震撼结合!

超动感音乐可视化:WebAudio与Shader的震撼结合!

作者头像
张晓衡
发布于 2019-12-16 09:51:44
发布于 2019-12-16 09:51:44
1.6K0
举报

Web Audio API 提供了在 Web 上控制音频的一个非常有效通用的系统,允许开发者来自选音频源,对音频添加特效,使音频可视化,添加空间效果 (如平移),等等。

Web Audio API 使用户可以在音频上下文(AudioContext)中进行音频操作,具有模块化路由的特点。在音频节点上操作进行基础的音频, 它们连接在一起构成音频路由图。即使在单个上下文中也支持多源,尽管这些音频源具有多种不同类型通道布局。这种模块化设计提供了灵活创建动态效果的复合音频的方法。

对于声音可视化表现,我们主要使用 AnalyserNode。AnalyserNode 接口表示了一个可以提供实时频域和时域分析信息的节点。它是一个不对音频流作任何改动的 AudioNode,同时允许你获取和处理它生成的数据,从而创建音频可视化。

律动的背景我们采用 shader 的方式生成,将通过 AnalyserNode 节点获取的声音频域采样数据作为纹理数据写入 cc.Texture2D 中,并作为参数 uChannel0 传递给 shader。

并不是所有的平台都支持 Web Audio API,比如微信小游戏、原生游戏,对于这种情况只能预先准备声音频域采样数据。

1

创建 AudioContext

对于不同的平台创建 AudioContext 的方法略有不同

代码语言:javascript
AI代码解释
复制
}

2

创建并连接 AudioNode

创建各种 AudioNode,并把它们串行连接起来

其中 AudioBufferSource 的 AudioBuffer 数据我们使用cc.AudioClip的_audio字段

其中 AnalyserNode 是负责对采样帧的音频信号做快速傅里叶变换得到频域数据,是我们可视化数据的来源.

  • AnalyserNode.fftSize: 代表了用于计算频域信号时使用的 FFT 的窗口大小,这个数值决定我们每帧可以从节点获取多少数据
  • AnalyserNode.frequencyBinCount: 代表用于可视化的数据值的数量(为 fftsize 的一半),我们用这个值初始化可视化数据缓冲
  • AnalyserNode.getByteFrequencyData(): 将当前频域数据拷贝进 Uint8Array 数组,我们用这个方法获取可视化数据
代码语言:javascript
复制

3

播放声音并获取可视化数据

一般来说bufferSource.start()就可以播放声音,但是由于Web API的安全策略,网页在播放音频前需要收到用户操作(一般就是点击事件),否则播放不会成功,仿造cc.audioEgine的写法

代码语言:javascript
AI代码解释
复制
if (self._touchPlay) {

播放音频的代码如下

代码语言:javascript
AI代码解释
复制
if (self._touchPlay) {

声音一直在播放中,我们每隔一段时间获取一次可视化数据,并把这个数据填充为(宽度为frequencyBinCount/4,高度为1)的cc.Texture2D

代码语言:javascript
AI代码解释
复制
backgroundSoundChannel.initWithData(

4

展现数据

我们把音频数据变成纹理的形式作为变量"uChannel0"发送给shader,在shader中可以用 texture(iChannel0, vec2(0.1, 0.0));其中rgba的每一个分量都是某个频率的采样值。

具体shader的表现方式就靠自己发挥了,在这个例子中,我是从 shadertoy.com 这个网站找的,在具体的effect文件中有标记出处。

5

小结

  • 使用WebAudio API播放音乐
  • 使用AnalyserNode获取声音频域采样数据
  • 将声音频域采样数据作为 cc.Texture2D 的 buffer 数据,并传给 shader
  • AudioManger: WebAudio 封装
  • CustomRenderComponent: 自定义渲染组件,也可用 cc.Sprite 代替
  • CustomShaderUpdate: 自定义Shader数据更新组件
  • shader(ltp-NeonLines,ltp-SquaresBackground)改编自shadertoy.com,出处见 effect 文件内说明

在线演示1:

https://ltp.gitee.io/gym/cocos-creator/ShaderSample/wave-show/web-mobile/index.html

在线演示2:(增加一个超华丽Shader,请在桌面端体验)

http://example.creator-star.cn/webaudio_and_shader/

感谢「刘天鹏」带来的精彩案例,使用WebAudio API与Shader相结合带来的震撼视觉享受,让游戏开发更有乐趣,回复【WebAudio】可获取案例源码!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WebAudio API
webAudio API webAudio API接口可以用来实现音乐可视化、音频剪辑、修声、语音、去声等等强大的操作 webAudioAPI接口关系图: AudioContext AudioCont
jinghong
2020/05/09
1.4K0
WebAudio API
FLV提取AAC音频单独播放并实现可视化的频谱
音频数字化就是将模拟的(连续的)声音波形数字化(离散化),以便利用数字计算机进行处理的过程,主要参数包括采样频率(Sample Rate)和采样数位/采样精度(Quantizing,也称量化级)两个方面,这二者决定了数字化音频的质量。
smy
2019/05/15
2.9K0
FLV提取AAC音频单独播放并实现可视化的频谱
花椒 Web 端多路音频流播放器研发
语音交友直播间 Web 端使用 WebRTC (Web Real-Time Communications) 实现多路音频流传输的播放。但由于云服务等原因,看播端我们需要改成 HTTP-FLV 或 HLS 协议的媒体服务。并实现
ConardLi
2019/09/04
3.7K0
花椒 Web 端多路音频流播放器研发
模拟制作网易云音乐(AudioContext)
记得好早前在慕课网上看到一款可视化音乐播放器,当前是觉得很是神奇,还能这么玩。由于当时刚刚转行不久,好多东西看得稀里糊涂不明白,于是趁着现在有时间又重新梳理了一遍,然后参照官网的API模拟做了一款网易播放器。没有什么创新的点,只是想到了就想做一下而已。 效果可以看这里:http://music.poemghost.com/,如果看不了,说明博主的服务器已经不在工作啦。(建议使用电脑浏览器打开,同时切换到手机模式来打开,因为在手机上测试时有问题,而且有很大性能损耗,经常会导致浏览器奔溃) 代码在这里:gith
糊糊糊糊糊了
2018/05/09
2.3K0
模拟制作网易云音乐(AudioContext)
使用 Cocos Creator 开发动感音乐游戏!
在浏览器端 AudioContext 是一个专门用于音频处理的接口,工作原理是将 AudioContext 创建出来的各种节点相互连接,音频数据流经这些节点,我们对其控制。
张晓衡
2019/12/16
2.7K1
使用 Cocos Creator 开发动感音乐游戏!
Threejs进阶之十六:音频可视化
最近事情比较多,博客更新的有点慢了,今天更新一期,主要聊一聊通过Threejs提供的音频API实现音频的可视化效果,先看下最终实现的效果
九仞山
2023/10/14
9200
Web Audio API 介绍和 web 音频应用案例分析
本文主要介绍了如何使用 Web Audio API 实现音频的剪辑、处理、合成和播放功能。作者通过实例演示了如何使用 Web Audio API 实现音频的剪辑、处理、合成和播放功能,包括音频的选帧、剪辑、淡入淡出、变速、变调、合成、播放控制等功能。此外,作者还介绍了 Web Audio API 的音频处理、合成和播放控制的用法,并提供了详细的示例代码。
QQ音乐技术团队
2017/11/21
9K0
Web Audio API 介绍和 web 音频应用案例分析
[前端]利用WebAudioAPI获取音频频谱(html5音频可视化)
项目希望可以把音频可视化,有条随声音波动的曲线或者是像唱吧那种。开始是搜到了腾讯大腿(TGideas)写的audio可视化组件,想着直接用,后来各种原因还是打算自己重新写一个……虽然明显写得low了很多。 腾讯大腿的audio组件地址 http://www.3fwork.com/b403/001620MYM013253/ GitHub https://github.com/tgideas/motion/blob/master/component/src/main/audio/audio.js
Tuzei
2020/03/16
4.3K0
用Web音频API来做一个音频可视化工具
如果你曾经想过像MilkDrop这样的音乐可视化工具是怎么做的,那么这篇文章就是为你准备的。我们将从使用Canvas API来做简单的可视化入手,然后慢慢转移到用WebGL着色器来做更复杂的可视化。
疯狂的技术宅
2019/03/27
3.3K0
chrome 66自动播放策略调整
Web浏览器正在朝着更严格的自动播放策略发展,以便改善用户体验,最大限度地降低安装广告拦截器的积极性并减少昂贵和/或受限网络上的数据消耗。这些更改旨在为用户提供更大的播放控制权,并使开发商获得合法用例。
gnip
2020/10/29
6.1K0
动感音乐导航栏的实现
在现代网页设计中,随着多媒体和互动元素的快速发展,网页的动效和用户体验成为了设计师与开发者追求的重要目标。而当涉及到音频的播放与互动时,如何将音乐元素与页面交互完美结合,往往是非常具有挑战性的。
繁依Fanyi
2025/04/24
5450
前端音频合成
AudioContext 属于 Web Audio 中的一个 API,创建音频你可以使用
上山打老虎了
2022/06/15
2K0
前端音频合成
又做了一个WEB端的音频可视化
最近没事的时候,看一些网站设计想着自己也做一个比较简单的页面啥的,想来想去最后还是打算做一个音乐可视化,因为我本身就挺喜欢听歌的,如果有一个看着比较舒服的界面听歌,发发呆感觉也是一种休息,所以music-radio完成啦
零式的天空
2022/03/28
1K2
Android FFmpeg系列06--音频可视化
我们在上篇文章中通过FFmpeg解码了本地mp4文件的音频码流为PCM数据,并通过AudioTrack进行播放
雪月清
2022/09/21
2.3K0
Android FFmpeg系列06--音频可视化
用 Three.js 和 AudioContext 实现音乐频谱的 3D 可视化
最近听了一首很好听的歌《一路生花》,于是就想用 Three.js 做个音乐频谱的可视化,最终效果是这样的:
神说要有光zxg
2021/12/04
3K0
用 Three.js 和 AudioContext 实现音乐频谱的 3D 可视化
Cocos Creator 出新版本啦, 2.1.2 圆形Shader终于可以完美解决了!
自 Cocos Creator 2.1.0 发布以来,经过半年时间更新迭代,版本现已趋于稳定,目前 2.1 的新增用户已经占据主流。因此我们计划减少 2.0 版本的后续维护力度,将分散的精力集中投入到引擎后续的发展中,力争将 Cocos Creator 打造成更加专注、开放、健康的开源平台。
张晓衡
2019/09/25
3.4K0
Cocos Creator 出新版本啦, 2.1.2 圆形Shader终于可以完美解决了!
做一个简易简单音乐播放器
那天夜里,我戴上耳机准备听首老歌,却猛然发现自己手机里找不到一个既好看又好用的小型音乐播放器 App。主流播放器不是太臃肿,就是界面审美老旧。突然就冒出一个念头——干脆自己写一个简约现代、功能完善的小型音乐播放器吧。
繁依Fanyi
2025/05/14
6580
Python 播放音频文件
playsound是纯Python、跨平台、单功能模块,不依赖于播放声音。使用此模块,可以使用一行代码播放声音文件:
Python知识大全
2020/01/20
7.6K0
Python 还能播放音频,而且花样多多?
playsound是纯Python、跨平台、单功能模块,不依赖于播放声音。使用此模块,可以使用一行代码播放声音文件:
Python知识大全
2020/02/21
4.4K0
AVFoundation 文本转语音和音频录制 播放
现在你应该对AVFoundation有了比较深入的了解,并且对数字媒体的细节也有了一定认识,下面介绍一下 AVFoundation的文本转语音功能
iOSSir
2019/06/14
3K0
相关推荐
WebAudio API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场