H5的Canvas如何实现绘制音乐环形频谱图

这次给大家带来h5的canvas如何实现绘制音乐环形频谱图,h5canvas实现绘制音乐环形频谱图的注意事项有哪些,下面就是实战案例,一起来看一下。

在B站我们有很多的小伙伴们应该都看到过用AE做的可视化音乐播放器播放音乐的视频,看着特别酷炫带感有木有。

1.jpg

所以今天我就用 Canvas 做个简单 环形频谱图。

那么~ ヾ(o・ω・)ノ 开始吧!

1.首先绘制静态的效果

静态效果

绘制静态效果很简单,我们只要从一点出发根据一定角度绘制线条,然后画个圆从中点开始覆盖线条就行了

    var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    (function drawSpectrum() {        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条        for (var i = 0; i < 360; i++) {            var value = 8;            cxt.beginPath();            cxt.lineWidth = 2;            cxt.moveTo(300, 300);             //R * cos (PI/180*一次旋转的角度数) ,-R * sin (PI/180*一次旋转的角度数)            cxt.lineTo(Math.cos((i * 1) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 1) / 180 * Math.PI) * (200 + value) + 300));            cxt.stroke();        }        //画一个小圆,将线条覆盖        cxt.beginPath();        cxt.lineWidth = 1;        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);         cxt.fillStyle = "#fff";        cxt.stroke();        cxt.fill();     })();

登录后复制

2.调用AudioAPI,绘制音乐的频谱图

绘制音乐的频谱图

第一步完成后,第二步就很简单了,通过调用AudioAPI获取音频变化来改变线条长度。

注意!!!最新chrome浏览器可能需要在http服务器上运行~

你可以参考文章绘制音乐的频谱图(使用Analyser节点)

     var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体    var audio = new Audio("demo.mp3");    //创建节点    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination    source.connect(analyser);    analyser.connect(context.destination);    //创建数据    var output = new Uint8Array(360);    (function drawSpectrum() {        analyser.getByteFrequencyData(output);//获取频域数据        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条        for (var i = 0; i < 360; i++) {            var value = output[i] / 8;//<===获取数据            cxt.beginPath();            cxt.lineWidth = 2;            cxt.moveTo(300, 300);            //R * cos (PI/180*一次旋转的角度数) ,-R * sin (PI/180*一次旋转的角度数)            cxt.lineTo(Math.cos((i * 1) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 1) / 180 * Math.PI) * (200 + value) + 300));            cxt.stroke();        }        //画一个小圆,将线条覆盖        cxt.beginPath();        cxt.lineWidth = 1;        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);        cxt.fillStyle = "#fff";        cxt.stroke();        cxt.fill();        //请求下一帧        requestAnimationFrame(drawSpectrum);    })();

登录后复制

3.环形左右同步显示

实习步骤2后其实已经完成一大半了,不过细心的小伙伴们会发现环形最右端点上的线条间差了好多。

处理办法很多,我们用其中一个简单的办法处理,那就是让其左右对称的显示。

     var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体    var audio = new Audio("demo.mp3");    //创建节点    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination    source.connect(analyser);    analyser.connect(context.destination);    //创建数据    var output = new Uint8Array(361);    (function drawSpectrum() {        analyser.getByteFrequencyData(output);//获取频域数据        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条        for (var i = 0; i < output.length; i++) {            var value = output[i] / 10;            //绘制左半边            cxt.beginPath();            cxt.lineWidth = 1;            cxt.moveTo(300, 300);            cxt.lineTo(Math.cos((i *0.5 + 90) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i *0.5 + 90) / 180 * Math.PI) * (200 + value) + 300));            cxt.stroke();            //绘制右半边            cxt.beginPath();            cxt.lineWidth = 1;            cxt.moveTo(300, 300);            cxt.lineTo( (Math.sin((i *0.5) / 180 * Math.PI) * (200 + value) + 300),-Math.cos((i *0.5) / 180 * Math.PI) * (200 + value) + 300);            cxt.stroke();        }        //画一个小圆,将线条覆盖        cxt.beginPath();        cxt.lineWidth = 1;        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);        cxt.fillStyle = "#fff";        cxt.stroke();        cxt.fill();        //请求下一帧        requestAnimationFrame(drawSpectrum);    })();

登录后复制

4.添加波形图

最后我们来尝试在圈内,添加一个波形图

你可以参考文章绘制音乐的波形图(使用Analyser节点)

示例

     var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体    var audio = new Audio("demo.mp3");    //创建节点    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination    source.connect(analyser);    analyser.connect(context.destination);    //创建数据    var output = new Uint8Array(361);    //计算出采样频率44100所需的缓冲区长度    var length = analyser.frequencyBinCount * 44100 / context.sampleRate | 0;    //创建数据     var output2 = new Uint8Array(length);    (function drawSpectrum() {        analyser.getByteFrequencyData(output);//获取频域数据        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条        for (var i = 0; i < output.length; i++) {            var value = output[i] / 10;            //绘制左半边            cxt.beginPath();            cxt.lineWidth = 1;            cxt.moveTo(300, 300);            cxt.lineTo(Math.cos((i * 0.5 + 90) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 0.5 + 90) / 180 * Math.PI) * (200 + value) + 300));            cxt.stroke();            //绘制右半边            cxt.beginPath();            cxt.lineWidth = 1;            cxt.moveTo(300, 300);            cxt.lineTo((Math.sin((i * 0.5) / 180 * Math.PI) * (200 + value) + 300), -Math.cos((i * 0.5) / 180 * Math.PI) * (200 + value) + 300);            cxt.stroke();        }        //画一个小圆,将线条覆盖        cxt.beginPath();        cxt.lineWidth = 1;        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);        cxt.fillStyle = "#fff";        cxt.stroke();        cxt.fill();        //将缓冲区的数据绘制到Canvas上         analyser.getByteTimeDomainData(output2);        var height = 100, width = 400;        cxt.beginPath();        for (var i = 0; i < width; i++) {            cxt.lineTo(i + 100, 300 - (height / 2 * (output2[output2.length * i / width | 0] / 256 - 0.5)));        }        cxt.stroke();        //请求下一帧        requestAnimationFrame(drawSpectrum);    })();

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

相关阅读:

如何使用canvas来制作好用的涂鸦画板

如何使用s-xlsx实现Excel 文件导入和导出(下)

以上就是H5的Canvas如何实现绘制音乐环形频谱图的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2783798.html

(0)
上一篇 2025年3月8日 16:54:57
下一篇 2025年3月8日 16:55:05

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • canvas怎样做出黑色背景的红色烟花

    这次给大家带来canvas怎样做出黑色背景的红色烟花,canvas做出黑色背景的红色烟花的注意事项有哪些,下面就是实战案例,一起来看一下。 html 登录后复制 css body {    background: #000;    marg…

    2025年3月8日
    200
  • canvas怎样做出黑色背景的青色烟花

    这次给大家带来canvas怎样做出黑色背景的青色烟花,canvas做出黑色背景的青色烟花的注意事项有哪些,下面就是实战案例,一起来看一下。 html 2018 登录后复制 css html,body {    padding: 0px;  …

    2025年3月8日
    200
  • js实现将canvas生成图片保存或直接保存一张图片

    本文主要和大家分享js实现将canvas生成图片保存或直接保存一张图片,希望能帮助到大家。 将canvas数组保存 function downLoadImage(canvas,name) {    var a = document.crea…

    编程技术 2025年3月8日
    200
  • js与canvas合成图片做出微信公众号海报功能

    这次给大家带来js与canvas合成图片做出微信公众号海报功能,js与canvas合成图片做出微信公众号海报功能的注意事项有哪些,下面就是实战案例,一起来看一下。 在微信公众号开发中,很多时候都有个需求是一张图加上头像和昵称或者其他数据生成…

    2025年3月8日 编程技术
    200
  • 用HTML5实现图片压缩与上传

    这次给大家带来用HTML5实现图片压缩与上传,HTML5实现图片压缩与上传的注意事项有哪些,下面就是实战案例,一起来看一下。 canvas压缩 使用了github上的一个现成库:https://github.com/stomita/ios-…

    2025年3月8日 编程技术
    200
  • H5塔台管制飞机大战

    这次给大家带来h5塔台管制飞机大战,做出h5塔台管制飞机大战的注意事项有哪些,下面就是实战案例,一起来看一下。  想做这个游戏已久,今天终于初步完成,先解释下,这是一个模拟机场塔台管制指挥的游戏,飞机从不同的方向飞入管制空域,有不同的目的地…

    2025年3月8日
    200
  • h5做出网页录音功能

    这次给大家带来h5做出网页录音功能,h5做出网页录音功能的注意事项有哪些,下面就是实战案例,一起来看一下。 得益于前辈的分享,做了一个h5录音的demo。效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如…

    2025年3月8日 编程技术
    200
  • H5的缓存Manifest的使用

    这次给大家带来H5的缓存Manifest的使用,使用H5的缓存Manifest注意事项有哪些,下面就是实战案例,一起来看一下。 在app中更新h5页面一直有缓存问题。默认什么都不做的情况下,app有一定的空间缓存页面。一开始更新之后会马上加…

    2025年3月8日 编程技术
    200
  • html5动画实现舞动的雨伞

    这次给大家带来html5动画实现舞动的雨伞 ,实现html5动画舞动的雨伞的注意事项有哪些,下面就是实战案例,一起来看一下。 HMTL5的学习断断续续,方法不用又生疏了,昨天做的一个雨伞的Demo,先看看效果 主要是运用了中心点变换和旋转两…

    2025年3月8日
    200
  • Html5的localStorage使用详解

    这次给大家带来html5的localstorage使用详解,html5的localstorage使用注意事项有哪些,下面就是实战案例,一起来看一下。 localStorage是Html5新加入的特性,这个特性主要用来做浏览器本地存储 一、判…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论