开发者资讯

 首页 > 开发者资讯 > 编程开发 > 用JavaScript和CSS3在HTML里实现音乐可视化效果 

用JavaScript和CSS3在HTML里实现音乐可视化效果 

分享到:
【字体:
导读:
          Patrick Wied受到一个漂亮的Youtube音频可视化工具的启发,心想,嗨,为什么我不开发一个自己的音乐可视化程序呢?(请使用谷歌浏览器观看演示)观看演示本文里将介绍Patrick Wied开发出这种效果使用的技术。尽管

 

Patrick Wied受到一个漂亮的Youtube音频可视化工具的启发,心想,“嗨,为什么我不开发一个自己的音乐可视化程序呢?”

(请使用谷歌浏览器观看演示)

本文里将介绍Patrick Wied开发出这种效果使用的技术。尽管WebGL和Canvas 2D技术看起来都非常的有前途(而且很有趣,本人更喜欢多学一点WebGL知识!),但对于Patrick Wied想实现的这个功能,使用纯HTML,利用CSS3来实现动画效果,足够了(将来Patrick Wied有计划将它迁移到其它技术上)。

这个试验特别的有趣,对Patrick Wied来说这是他第一次运用学习的数学知识到编程中。尽管涉及到的数学部分很浅显,Patrick Wied还是对能掌握一些东西的工作原理感到非常的兴奋。

下面就来讲一讲Patrick Wied是如何实现它的。

获取音频数据

可视化的前提是需要获取音频数据。幸运的是,现代浏览器(谷歌浏览器,火狐浏览器等)里的 Web Audio API 对Web音频提供了丰富的操作功能。这里最重要是调用AnalyserNodeAnalyserNode将会给我们提供实时的音频数据,用于可视化显示。关于更详细的音频操作,可以阅读w3c Web Audio Specs。

下面里看看为获取音频数据做的准备。

首先我们需要在页面上添加一个

<audio id="myAudio" src="path-to-audio.mp3">audio>

下面是如何使用AnalyserNode获取数据:

window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;
  window.onload = function() {
  var ctx = new AudioContext();
  var audio = document.getElementById('myAudio');
  var audioSrc = ctx.createMediaElementSource(audio);
  var analyser = ctx.createAnalyser();
  // we have to connect the MediaElementSource with the analyser 
  audioSrc.connect(analyser);
  // we could configure the analyser: e.g. analyser.fftSize (for further infos read the spec)

  // frequencyBinCount tells you how many values you'll receive from the analyser
  var frequencyData = new Uint8Array(analyser.frequencyBinCount);

  // we're ready to receive some data!
  // loop
  function renderFrame() {
     requestAnimationFrame(renderFrame);
     // update data in frequencyData
     analyser.getByteFrequencyData(frequencyData);
     // render frame based on values in frequencyData
     // console.log(frequencyData)
  }
  audio.start();
  renderFrame();
};

分析音频数据

现在我们有了非常不错的音乐和数据。Patrick Wied测试过不少首歌曲,发现 frequencyData 在 [0, 255] ⊂ ℕ 之间的数据才有意义。而且有些地方frequencyData的数据始终是0——删除它们能更好的表现视觉动画,但很可能丢失了一下音频信息。

视觉化音频数据

这是最有趣的部分。Patrick Wied先实现了一个柱状条样式的动画效果,每个柱子都表示frequencyData里的一组数据。每个柱子都是用纯HTML实现的,它的高度是使用CSS根据音频数据分析结果即时改变。为了让动画更加顺滑,Patrick Wied将CSS动画的transition属性设置为0.1秒。

更有趣的效果——辐射状动画

其实也是很简单,但需要运用更多的技巧。为了让物体按环状对齐,需要使用几何函数(还记得Cos & Sin吧?)

// a full circle
var twoPi = 2*Math.PI;
var objectsCount = 12;
var radius = 100

// you want to align objectsCount objects on the circular path
// with constant distance between neighbors
var change = twoPi/objectsCount;
for (var i=0; i < twoPi; i+=change) {
  var x = radius*cos(i);
  var y = radius*sin(i);
  // rotation of object in radians
  var rotation = i;
  // set the CSS properties to calculated values
}

想要实现更奇特的效果?你实际上是可以在这个2D空间里使用任何的弧形,比如,心型,泪滴型等等。但我还是更喜欢传统的视觉效果。

 

分享到:
PHP开发框架 Yii 2.0.2 发布提供下载
Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。 Yiic 生成的应用程序的界面如下:   Yii 2.0.2 发布,此版本现已提供下载:https://github.com/yiisoft/yii2/rele...
敏捷开发之数据库版本控制完全指南
在这个充斥着大数据与商业智能的新代时,唯一不变的技术就是变化,尤其是在数据库方面。出于数据统计、继续增加的对服务的需求,以及规定制度等方面的原因,几乎每天都有业务方面的变更需求,这些都会对数据库产生变更需求。当数据库变更发生时,能否从自动化中获得更大的敏捷性,以较少的资源实现较多的功能,正是那些具有...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……