摇滚吧HTML5!Jsonic超声波前端交互!

  前些年吹过一阵canvas制作html5游戏的东风,相信不少同学重温了一把高中物理课本上的牛顿定律。时光如梭,你是否还记得牛顿定律后面一章的各种机械波的物理定律?环视四周,光纤、wifi、蓝牙、广播都有波的身影,可以说机械波桥接了信息时代。Jsonic作为前端的音频交互框架,也有利用声波进行数据传输的接口,在介绍API之前,先分享一些web audio原生编码的干货。

  读了这系列前两篇博文摇滚吧HTML5!有声前端交互!(一)摇滚吧HTML5!有声前端交互!(Hello, Jsonic!)的同学,应该已经能够使用web audio产生一个特定频率的声波了。所谓的超声波,就是频率超过20000hz的声波,正常成人人耳能接收的声波范围是20-20000hz。20hz以下的次声波因为频率和人体一些器官相近,可能对人体造成损伤,所以不建议使用。这么一看,发出超声波就很简单了,代码如下,使用oscillaor节点。

var context = new webkitAudioContext(),
    osc  = context.createOscillator();
osc.frequency.value = 20000;
osc.connect(context.destination);
osc.start(0);

  这里有一点值得注意,oscillator节点的start方法只能调用一次。一旦调用了oscillator的stop方法,想要再发出这个频率的声音,就只能再创建一个新的对象了。在web audio中,我们还可以使用gain节点配合oscillator的方法,定期发出指定的声波。你可以把gain节点理解为一个信号强度调节器,通过设置gain.gain.value的值,可以控制信号的强弱。这个值取值范围是0~1。玩过音箱,效果器这些东西的同学应该就比较好理解了,其实web audio可以串联各种效果的节点。(下图仅供参考)

   

  回到代码的世界:

var context = new webkitAudioContext(),
    gain = _ctx.createGain(),
    osc  = context.createOscillator();
osc.frequency.value =20000;
gain.gain.value=0;
osc.connect(gain);
gain.connect(context .destination);
osc.start(0);
gain.gain.setValueAtTime(1,1);
gain.gain.setValueAtTime(0,2);

  通过以上代码,可以在1-2秒这个时间区间内发出一个20000hz的超声波信号。这里调用setValueAtTime方法改变gain节点的值,波形变化过程如下图所示。gain节点有各种不同的方法,这些方法使信号强度到达预设值有不同的变化过程,读者可自行查阅web audio的API。

  通过gain节点控制信号和直接使用oscillator的start和stop方法控制信号各有利弊,具体使用大家可自行考虑。有了信号源,接下来就是接收的问题了。很多文章都介绍过html5的音频可视化,其核心就是通过analyser节点获取数据。这里简单罗列下analyser节点获取数据的几种方法。

//通过浮点数组获取时域数据
var data = new Float32Array(analyser.fftSize);
analyser.getFloatTimeDomainData(data);

//通过浮点数组获取频域数据
var data = new Float32Array(analyser.fftSize);
analyser.getFloatFrequencyData(data);

//通过 Uint8数组获取时域数据
var data = new Uint8Array(analyser.fftSize);
analyser.getByteTimeDomainData(data);

//通过 Uint8数组获取频域数据
var data = new Uint8Array(analyser.fftSize);
analyser.getByteFrequencyData(data);

  时域信号和频域信号可以通过傅里叶变化互相转换,Jsonic选择的是unit8数组获取频域信号,以下是获取频域数据的代码。

var ctx = new webkitAudioContext();
navigator.webkitGetUserMedia({
    audio:{optional:[{echoCancellation:false}]}
},function(stream){
    var analyser = ctx.createAnalyser(),
        _input = ctx.createMediaStreamSource(stream),
        data = new Float32Array(analyser.fftSize);
    _input.connect(analyser);
    analyser.getFloatFrequencyData(data);
},function(e){});

  这里的data数组获取的是所有频率的数据,那么怎么找到对应的频率数据呢?又要上物理课了。。。。。。这里要用到 奈奎斯特定理,不懂的同学可以直接看公式B=2W。通过audioContext节点sampleRate属性,我们可以获取在当前web audio上下文的采样率(一般是192000),那么通过奈奎斯特定理,这个采样率/2就是我们能采集到的信号频率的范围了。上面我们采集到的data数组长度默认是1024。以192000的采样率为例,data数组就是把0-96000hz的声波数据均分成1024个频率存储。到这里我们就能获取到频率数据了。虽然采样范围很广,但是不同设备通过oscillator节点能产生的声波的频率极限不同,我之前用iphone5测试的时候在22500hz左右。

下面简单介绍下怎么用Jsonic收发超声波数据,更多信息可以自行捣鼓jsonic.net

  在jsonic之前的版本中,使用的是峰值分析法解码数据。最近发布了新的版本,使用的是波形分析法,使用了新的Band对象。无论接收还是发送端,在Jsonic中都要创建一个band实例。

var band = new Jsonic.Band();
band.initDefaultChannel();

接收端 demo (点击start按钮后,需要授权浏览器使用麦克风)

navigator.webkitGetUserMedia({
    audio:{optional:[{echoCancellation:false}]}
    },function(stream){
        _input = band.AudioContext.createMediaStreamSource(stream);
        band.listenSource(_input);
        band.scanEnvironment();
},function(e){});

发射端 demo (功放,发射输入框中的文字)

band.send(‘Hello Jsonic‘,function(){
    //call back
});

最后附上github地址 https://github.com/ArthusLiang/jsonic 走过路过,给个star :),同时也期待前端大神加盟。

转发请注明出处http://www.cnblogs.com/Arthus/p/4281442.html

时间: 2024-10-11 18:09:05

摇滚吧HTML5!Jsonic超声波前端交互!的相关文章

摇滚吧HTML5!有声前端交互!(Hello, Jsonic!)

软件工程师们摆弄1和0编写他们的乌托邦,音乐人门把玩12平均律上的音符构筑他们的伊甸园.最近,我偶然看了<蓝色骨头>这部电影,片中的男主角是位黑客,同时又兼具音乐创作的才华.在现实生活中,这虽非典型,但也不是特例,我身边便有一些摆弄0和1的朋友,略有情调地发烧着. 上一篇博文 摇滚吧HTML5!有声前端交互!(一) 中,我介绍了12平均律,引入了音高和时值,并谈及了其在Web Audio中的实现.按着这个节奏,连音成谱就有了曲子.借着这系列博文,我整理了下之前写的音频交互相关的Javascri

摇滚吧HTML5!有声前端交互!(一)

生命的伊始,婴儿用明亮的哭声宣告一个新生命的诞生,睁开双眼之前,一双小耳朵已经开始聆听这个世界.在如今的用户体验领域,几乎所有公司都会有视觉设计师,却鲜有注重听觉交互的公司.随着各大厂商对HTML5支持的日渐完善,前端工程师其实早已可以摆弄各种音波,让复合型开发走得更远. 声波是一种机械波,通过波的物理属性我们可以做很多事情.比如,利用声波的频率编码进行数据传递,分析频域或者时域的数据进行可视化应用,或者结合光波的特性做些视听联动.通过HTML5中的Web Auido规范,以上所有都能实现.我在

云适配将推出中国首个开源 HTML5 跨屏前端框架 - Amaze UI

云适配,这是一家能以一行代码将你的网站移动化,实现网址不变且内容实时自动同步的服务提供商.云适配所采用的技术是一项基于云计算.利用html5进行网站跨屏适配,它为目标网站开发一行JS代码,并嵌入PC网站,这个JS代码通过对PC网站目标网页数据的分析和抓取,在云端完成用户当前设备的网页最佳展现方式的计算,最后在浏览器端实现html结构的重排及CSS的重新渲染,以适应移动端用户的浏览习惯. 在他们用一行代码做适配的过程中,积累了一套跨屏的前端常用网页组件,而最近,他们想把这套组件开源出来,将这套组件

前端交互开发微体验--总结了一些国内外炫酷的网站

前端交互开发微体验 关于首屏灵动小效果,微交互提升页面生机: 一.关于首屏视频播放 http://designmodo.com/startup/ 感官体验:科技感,高大上,酷 综合评价:如页面请求不多且视频占空小的情况下使用.一般为首屏轮播图的情况下使用,前两张轮播为图片,最后为视频,多给视频一些加载时间.还有就是非首屏使用. 推荐指数:★★★☆☆     二.Hover时实现图片随着鼠标方向而变动 http://atieva.com/ https://labs.invisionapp.com/

了解php数据转json格式与前端交互基础

php数据转json格式与前端交互 ArryJson1.php <?php $test=array(); $word=array("我12","要43","把23","你65","们7","全87","都","吃","掉79","嗯78","啊09","蒙67",

HTML5 &amp; CSS3的新交互特性

本文标题的这副图片,是用Phosotshop制作的.但是,在搜索引擎中你却无法搜索到它,搜索引擎还没有强大到能够识别图片里面的文字.并且由于图片的体积不算太小,可能网速慢的网友在浏览的时候不得不耐心的等待图片的刷新.那么,有没有一种新的方法可以避免这些缺点呢? 有的,HTML5和CSS3就可以满足你的需求.甚至,它可以做的更多,更好.作为一名设计师,我们应当了解它们是什么东西,有什么特性,从而进一步思考通过HTML5和CSS3我们能做些什么. 什么是HTML5和CSS3 HTML和CSS并不难理

Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转

Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 - 转 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS

学习HTML5之类的前端技术的好方法!

今天学习HTML5,把网上的部分知识点复制到记事本里时,忽然醒悟,干嘛不把记事本改成HTML呢,还能随手进行新知识新操作的实践! 虽然比起针对知识点去实践有点麻烦,但是这样学习的时候,复习到了很多几乎快要忘记的东西,比如&.<.>.空格的转义字符,一下子熟练了很多2333 而且还有个好处,能练习各种文章格式的排版,对于有点强迫症似的我来说,直接复制粘贴一大段话到一个p标签里,我是绝对无法容忍的!哈哈!

开发眼中的一些前端交互优化

一.移动web开发与PCweb开发有哪些不同? 首先一点就是性能:手机端的性能,要求更高: M中有很多meta标签:V中的css有很多屏幕适配:C中的交互优化与性能优化: 交互优化与性能优化的差别 系统真的快于用户感觉很快,是两码事:交互优化是更多的根据用户的实际感受来优化. 1. 交互优化 – 点击事件 如下场景:延时,卡顿: 根本原因:默认点击有300ms延迟:有很多pc网页没有做移动端分辨率兼容,需要放大缩小来浏览,则简单暴力用双击300ms以内来决定放大缩小.所以单击的时候会有延迟 移动