【H5 音乐播放实例】第五节 音轨制作

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【H5 音乐播放实例】第五节 音轨制作

我就不瞎比比了,直接上代码吧:

//获取随机颜色
function randomColor(){
    var r = Math.floor(Math.random()*256);
    var g = Math.floor(Math.random()*256);
    var b = Math.floor(Math.random()*256);
    return "rgb("+r+","+g+","+b+")";//IE7不支出rgb
};
window.onload = function(){
  //给音乐播放器(audio)添加一个timeupdate时间
  document.getElementById("music").ontimeupdate = function(){
      var currentTime = Math.floor(this.currentTime); //获取当前时间
      var m = parseInt(currentTime / 60);//分钟
      var s = parseInt(currentTime % 60);//秒钟
      var time = (m<10?("0"+m):m)+":"+(s<10?("0"+s):s); //格式化
      //console.log(time); //打印出来看看
      // 百分比 = 当前时长 ÷ 总时长 × 100%
    var total = this.duration;//总时长
    //console.log(currentTime + '=======' + total);
    //console.log( Math.floor(currentTime / total * 100) + "%" );
    document.getElementsByClassName("progress")[0].style.width = Math.floor(currentTime / total * 100) + "%" ;
  }
  //音轨制作
  var box = document.getElementsByClassName('mbox')[0];  //获取承载音轨的父盒子
  var allWidth = box.clientWidth;//获取承载音轨盒子的宽度
  var itemWidth = 5;
  var len = (allWidth / itemWidth );     //计算一共出现多少条音轨 
  var html = '';                  //动态拼接音轨
  for(var i = 0;i < len ; i ++){
      html+="<span class='item' style='left:"+(i * itemWidth)+"px;background:"+randomColor()+";'></span>";
  }
  box.innerHTML += html;           //添加音轨
  var audio = document.getElementById("music");
  //1:音频上下文
  window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
  /*动画执行的兼容写法*/
  window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame;
  //2:初始化音轨对象
  var audioContext = new window.AudioContext();
  var flag = null; //控制是否解析的开关变量
  //拿到播放器去解析音乐文件
  var audioBufferSouceNode = audioContext.createMediaElementSource(audio);
  audio.onplay = function(){
      flag = true;
      //创建解析对象
      var analyser = audioContext.createAnalyser();
      parse(analyser,function(array){
          console.log(array); //打印解析出来的音轨节点
          for(var i = 0;i < len ; i ++){
              document.getElementsByClassName('item')[i].style.height = array[i] + 'px';
          }
      });
  }
  audio.onpause = function(){
      for(var i = 0;i < len ; i ++){
          document.getElementsByClassName('item')[i].style.height = 1 + 'px';
      }
      flag = false;
  }
  function parse(analyser,callback){
      if(!flag){
          return;
      }
      audioBufferSouceNode.connect(analyser); 
      analyser.connect(audioContext.destination);
      var array = new Uint8Array(analyser.frequencyBinCount);
      analyser.getByteFrequencyData(array);
      if(callback) callback(array);
      requestAnimationFrame(function(){
          parse(analyser,callback);
      });
  }
}

css:

.item {
    position:absolute;
    width:5px;
    height:1px;
    left:0px;
    bottom:0px;
    opacity: 0.5;
}


效果:

微信图片_20230502200628.png

##总结思路

#####1.获取mbox的宽度,然后动态计算一共有多少条音轨。

#####2.用H5的音频解析器去解析当前音乐播放的各频率的音高

#####3.用这些音高去给每一条音轨动态地设置高度height

相关文章
|
7月前
|
存储 缓存 Unix
微信小游戏制作工具中实现计时功能
微信小游戏制作工具中实现计时功能
288 0
|
7月前
|
人工智能 算法 计算机视觉
我的自描外挂制作日志——FPS类游戏的自瞄【构思准备】
我的自描外挂制作日志——FPS类游戏的自瞄【构思准备】
279 0
|
移动开发 前端开发
【H5 音乐播放实例】第六节 其他
【H5 音乐播放实例】第六节 其他
|
移动开发 前端开发
【H5 音乐播放实例】第三节 音乐详情页制作(3)
【H5 音乐播放实例】第三节 音乐详情页制作(3)
101 0
|
移动开发
【H5 音乐播放实例】第四节 音乐详情页制作 -音乐的播放和暂停
【H5 音乐播放实例】第四节 音乐详情页制作 -音乐的播放和暂停
149 0
|
移动开发 前端开发 容器
【H5 音乐播放实例】第二节 音乐详情页制作(2)
【H5 音乐播放实例】第二节 音乐详情页制作(2)
|
移动开发 前端开发 JavaScript
【H5 音乐播放实例】第一节 音乐详情页制作(1)
【H5 音乐播放实例】第一节 音乐详情页制作(1)
136 0
|
监控 搜索推荐 C#
听音乐不过瘾?自制一个音乐播放器!【附带函数源码】
听音乐不过瘾?自制一个音乐播放器!【附带函数源码】
176 0
听音乐不过瘾?自制一个音乐播放器!【附带函数源码】
|
Android开发
Android开发;教你做一个后台相机
做过相机的同学都知道,Camera需要一个SurfaceView来承载预览的输出流,SurfaceView的特性限制了它必须要有一个可见的View才能够使用。
2165 0
|
前端开发
用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件
原文:用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件      一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种CodeProject啊,终于让我找到海外兄弟写的源码了,原理是通过不断向摄像头读取图片不断刷新到窗体控件上。
1029 0