HTML5技术

Web Audio API之手把手教你用web api处理声音信号 - GabrielChenCN(2)

字号+ 作者:H5之家 来源:博客园 2015-12-27 14:37 我要评论( )

//直接从audio处理音频源,声明一些必要的变量var context1;var source;var analyserfa;var canvasFormAudio;var ctxfa;//初始化画布canvasFormAudio = document.getElementById('canvasFormAudio');ctxfa = canvas

//直接从audio处理音频源,声明一些必要的变量 var context1; var source; var analyserfa; var canvasFormAudio; var ctxfa; //初始化画布 canvasFormAudio = document.getElementById('canvasFormAudio'); ctxfa = canvasFormAudio.getContext("2d");
//建立一个音频环境,因为浏览器实现不同,做了一点兼容性处理 try { context1 = new (window.AudioContext || window.webkitAudioContext); } catch(e) { throw new Error('The Web Audio API is unavailable'); } //建立一个分析器 analyserfa=context1.createAnalyser(); window.addEventListener('load', function(e) { // 从audio标签获取声音源 source var audio =document.getElementById("audio"); var source = context1.createMediaElementSource(audio); source.connect(analyserfa); analyserfa.connect(context1.destination); //调用绘图函数 drawSpectrumfa(); }, false);
      //绘图函数 function drawSpectrumfa() { var WIDTH = canvasFormAudio.width; var HEIGHT= canvasFormAudio.height; var array = new Uint8Array(128); //复制当前的频率值到一个无符号数组中 analyserfa.getByteFrequencyData(array); //clearRect(矩形左上角x坐标,矩形左上角y坐标,清除矩形的宽,清除矩形的高) ctxfa.clearRect(0, 0, WIDTH, HEIGHT); //循环生成长条矩形 for ( var i = 0; i < (array.length); i++ ){ var value = array[i]; //fillRect(矩形左上角x坐标,矩形左上角y坐标,矩形宽,矩形高)
         //这里我们的array一共有128组数据,所以我们当时canvas设置的宽度为5*128=640 ctxfa.fillRect(i*5,HEIGHT-value,3,HEIGHT); } //根据浏览器频率绘图或者操作一些非css效果 requestAnimationFrame(drawSpectrumfa); }

  

第二块:频域图模仿和圆形声波图

这两个图的音源都是利用浏览器调用电脑麦克风取得,所以一定要同意浏览器请求的麦克风权限。

绘图区域

<h1>频域图模仿</h1> <canvas></canvas> <h1>圆形声波图</h1> <canvas></canvas>

初始化init()函数、从麦克风获取音源和绘图函数

var canvas; var ctx; var audioContext; var analyser; var mic; //初始化两个画布的函数,声明为2d绘图 function init() { canvasOne = document.getElementById('canvasOne'); ctx = canvasOne.getContext("2d"); canvasTwo = document.getElementById('canvasTwo'); ctx2 = canvasTwo.getContext("2d"); } //getMedia调用参数如下,返回一个多媒体流
    //constraints可选{ video: true, audio: true },代表获取多媒体的类型
//var stream = navigator.getUserMedia(constraints, successCallback, errorCallback); navigator.getMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia); navigator.getMedia ( { audio: true }, function (stream) { audioContext = new (window.AudioContext || window.webkitAudioContext); //返回一个多媒体流 mic = audioContext.createMediaStreamSource(stream); //creates an AnalyserNode 创建一个分析节点 analyser= audioContext.createAnalyser(); //fftsize默认值2048,是快速傅立叶变换用于频域分析的值,必须为2的幂,而我们得到的数据通常为其的一半,下面会说道 analyser.fftSize = 256; mic.connect(analyser);
      //调用绘图函数 drawSpectrum(); },function(){});      //圆形声波绘图和矩形绘图 function drawSpectrum() { var WIDTH = canvasOne.width; var HEIGHT= canvasOne.height;        //长度为128无符号数组用于保存getByteFrequencyData返回的频域数据 var array = new Uint8Array(128); analyser.getByteFrequencyData(array);
       //以下是根据频率数据画图,主要为canvas知识,不做详细解答 ctx.clearRect(0, 0, WIDTH, HEIGHT); ctx2.clearRect(0, 0, 800, 800); for ( var i = 0; i < (array.length); i++ ){ var value = array[i]; ctx.fillRect(i*5,HEIGHT-value,3,HEIGHT); } //ctx2.clearRect(700, 700, WIDTH, HEIGHT); for ( var i = 0; i < (array.length); i++ ){ var value = array[i]; ctx2.beginPath(); ctx2.arc(300,300,value,0,360,false); ctx2.lineWidth=5; ctx2.strokeStyle="rgba("+value+","+value+",0,0.2)"; ctx2.stroke();//画空心圆 ctx2.closePath(); } // requestAnimationFrame(drawSpectrum); };

 

4.最终效果

 

  

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • [H5]audio音频 - Aqiaoba

    [H5]audio音频 - Aqiaoba

    2017-02-13 15:00

  • video/audio在ios/android上播放兼容 - Jun-Hao

    video/audio在ios/android上播放兼容 - Jun-Hao

    2016-12-27 12:03

  • 《HTML5》 Audio/Video全解 - Samcc

    《HTML5》 Audio/Video全解 - Samcc

    2016-12-14 13:00

  • HTML5中Video和Audio - 进击的小前端

    HTML5中Video和Audio - 进击的小前端

    2016-12-01 10:00

网友点评
t