title: 让音乐响起来 categories:
var context;
try{
window.AudioContext = window.AudioContext || window.webkitAudioContext;
context = new AudioContext();
}
catch(e) {
alert('请更新至最新版的 Chrome 或者 Firefox');
}
<h3>二、音频流的获取</h3>
<h4>1. 标签引入</h4>
<p>标签引入是最直接的方式,</p><audio autoplay src="http://qianduannotes.duapp.com/file/tankWar.mp3">
浏览器不支持 audio 标签。
</audio>
<p>如果浏览器不支持 audio 标签,便会将其当做一个普通元素来解析,中间一行字也就会被显示出来。而支持 audio 标签的浏览器会忽略标签内任何文本。我们还可以为他加上 autoplay 、loop 等属性,使音频在进入页面之后立即循环播放。</p><audio autoplay="autoplay" controls="controls" src="http://qianduannotes.duapp.com/file/tankWar.mp3">
浏览器不支持 audio 标签。
</audio>
<p>controls 属性是用来控制显示音频文件的控制部分的。默认未设置 controls 属性。</p>
<h4>2. <span>webRTC mediaStream</span> Media Capture <span>(多谢<a href="http://www.cnblogs.com/hehe123/" target="_blank">@Hehe123</a>提醒,RTC属于通信了,此处只是获取 media 流)</span></h4>
<p>利用 getUserMedia 拿到本地的音频流。</p>// 前缀处理
window.AudioContext = window.AudioContext ||
window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
var context = new AudioContext();
navigator.getUserMedia({audio: true}, function(stream) {
// 获取本地流送入 AudioContext
var microphone = context.createMediaStreamSource(stream);
// filter为一个中间处理器,用来过滤音频
var filter = context.createBiquadFilter();
// microphone -> filter -> destination.
microphone.connect(filter);
filter.connect(context.destination);
}, function(){
console.log("出了点问题~ 是否在服务器环境下运行?");
});
<p>这里需要注意的是,使用 webRTC 需要在服务器环境下,你可以搭建一个本地服务器,也可以把代码上传到远程服务器上测试。</p>
<h4>3. FileSystem</h4>
<p>选择本地文件,读取音频流,拿到 Blob 流地址,送入 audio 中</p><input type="file" onchange="return run(this.files);"><br><br>
<audio controls id="audio"></audio>
<script type="text/javascript">
function run(files){
var blob = window.webkitURL.createObjectURL(files[0]);
audio.src = blob;
audio.autoplay = "autoplay";
}
</script>
<h4>4. 移动设备,还可以使用如下方式</h4>
<p>1)HTML Media Capture</p><input type="file" accept="audio/*;capture=microphone">
<p>2)device 元素</p><device type="media" onchange="update(this.data)"></device>
<audio autoplay>
<script>
function update(stream) {
document.querySelector('audio').src = stream.url;
}
</script>
</audio>
<h4>5. 从键盘获取</h4>
<p>本质并不是从键盘获取,而是通过键盘获取到我们设定的频率值,然后通过程序创建一段音频。如下面的程序:</p> <p><span>下面例子中可以按键盘上中间的一排按键(A到K)来发出不同的声音。</span></p>var AudioContext=AudioContext||webkitAudioContext;
var context=new AudioContext;
//为每个键盘位对应一个频率
var s={65:256,83:288,68:320,70:341,71:384,72:426,74:480,75:512};
//为每个频率创建一个Oscillator
for(var i in s)
value=s[i],
s[i]=context.createOscillator(),
s[i].frequency.value=value,
s[i].start();
//键盘按下时将相应频率的Oscillator连接到输出源上
addEventListener("keydown",function(e){
if(e=s[e.keyCode])e.connect(context.destination);
});
//键盘松开时将相应频率的Oscillator的连接取消
addEventListener("keyup",function(e){
if(e=s[e.keyCode])e.disconnect();
});
<p>这段代码引自次碳酸钴的<a href="http://www.web-tinker.com/article/20497.html" target="_blank">博客</a>.</p>
<h3>三、小结</h3>
<p>本文是个介绍性的文章,提到了 Web Audio API 的相关知识,以及如何在你的 web 程序中引入 音频流。没有写相关 demo,感兴趣的童鞋可以复制代码自己去测试,在后续文章中会给出测试 DEMO。</p>
<h3>四、参考文章</h3>
<ul> <li><a href="http://www.csdn.net/article/2013-07-10/2816178-Web-Audio-API-Firefox" target="_blank">http://www.csdn.net/article/2013-07-10/2816178-Web-Audio-API-Firefox</a> CSND</li> <li><a href="//hacks.mozilla.org/2013/07/web-audio-api-comes-to-firefox/">//hacks.mozilla.org/2013/07/web-audio-api-comes-to-firefox/</a> Mozilla</li> <li><a href="http://www.html5rocks.com/en/tutorials/webaudio/intro/#toc-context" target="_blank">http://www.html5rocks.com/en/tutorials/webaudio/intro/#toc-context</a> html5rocks</li> <li><a href="http://www.w3.org/TR/webaudio/" target="_blank">http://www.w3.org/TR/webaudio/</a> W3 Group</li> <li><a href="http://www.web-tinker.com/article/20497.html" target="_blank">http://www.web-tinker.com/article/20497.html</a> 次碳酸钴</li> </ul>