主要api解释:
`// 创建音频上下文
var audioCtx = new AudioContext()
// 创建音调控制对象
var oscillator = audioCtx.createOscillator()
// 创建音量控制对象
var gainNode = audioCtx.createGain()
// 音调音量关联
oscillator.connect(gainNode)
// 音量和设备关联
gainNode.connect(audioCtx.destination)
// 音调类型指定为正弦波
oscillator.type = 'sine'
// 设置音调频率
oscillator.frequency.value = 196.00
// 先把当前音量设为0
gainNode.gain.setValueAtTime(0, audioCtx.currentTime)
// 0.01秒时间内音量从刚刚的0变成1,线性变化
gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.01)
// 声音开始
oscillator.start(audioCtx.currentTime)
// 1秒时间内音量从刚刚的1变成0.001,指数变化
gainNode.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 1)
// 1秒后停止声音
oscillator.stop(audioCtx.currentTime + 1)
`
vue版本:实现功能:利用播放暂停按钮来切换:
`
data.isPlay = false;
let beeps = {
init() {
if (this.audioCtx) {
return;
}
this.audioCtx = new (window.AudioContext || window.webkitAudioContext)();
},
start(){
if(this.oscillator){
this.stop();
}
this.oscillator = this.audioCtx.createOscillator();
var gainNode = this.audioCtx.createGain();
this.oscillator.connect(gainNode);
gainNode.connect(this.audioCtx.destination);
gainNode.gain.value = 0.1;
this.oscillator.type = "sine";
this.oscillator.start(this.audioCtx.currentTime);
this.oscillator.frequency.value = 0;
},
stop(){
if(!this.oscillator){
return;
}
this.oscillator.stop()
},
beep(frequency) {
if (data.isPlay === false ) {
return;
} else {
if (this.oscillator) {
this.oscillator.frequency.value = frequency;
}
}
},
}; `
click(){
beeps.init();
data.isPlay = !data.isPlay;
}
if(data.isPlay){
beeps.play();
}else if(!data.isPlay){
beeps.stop();
}
if(data.isPlay){
beeps.beep(3333)
}
原生版本:实现功能:点击按钮播放一次声音,duration结束后自动停止:
`<div class="play-frequency">
<label style="font-size:18px;">频率音调</label>
<svg onclick="btnPlayClick()" version="1.1" id="play" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="40px" width="40px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
<path class="stroke-solid" fill="none" stroke="#99bbff" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7
C97.3,23.7,75.7,2.3,49.9,2.5" />
<path class="icon" fill="#99bbff" d="M38,69c-1,0.5-1.8,0-1.8-1.1V32.1c0-1.1,0.8-1.6,1.8-1.1l34,18c1,0.5,1,1.4,0,1.9L38,69z" />
</svg>
</div>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)()
//播放对应频率的声音
function btnPlayClick() {
console.log(elF.val())
beep(elF.val(), 30000)
}
function beep(frequency, duration) {
var oscillator = audioCtx.createOscillator()
var gainNode = audioCtx.createGain()
oscillator.connect(gainNode)
gainNode.connect(audioCtx.destination)
gainNode.gain.value = 0.3
oscillator.frequency.value = frequency
oscillator.type = 'triangle'
oscillator.start()
setTimeout(
function () {
oscillator.stop()
},
duration
)
}
参考文章:www.zhangxinxu.com/wordpress/2…