为什么我的start()和stop()方法不起作用?我无法暂停播放音频,有人可以看到我做的任何错误吗?
在JS小提琴中$
替换为jQuery
因此,继续使用下面的代码:
$('.play').click(function() {
audioBufferSouceNode.start();
});
$('.pause').click(function() {
audioBufferSouceNode.stop();
});
$('.volumeMax').click(function() {
audioBufferSouceNode.volume=1;
});
$('.volumestop').click(function() {
audioBufferSouceNode.volume=0;
});
$('.playatTime').click(function() {
audioBufferSouceNode.currentTime= 35;
audioBufferSouceNode.play();
});
但由于某种原因,它无法正常工作。这是我的index.php页面。
<div id="wrapper">
<div id="fileWrapper" class="file_wrapper">
<div id="info">
HTML5 Audio API showcase | An Audio Viusalizer
</div>
<label for="uploadedFile">Drag&drop or select a file to play:</label>
<input type="file" id="uploadedFile"></input>
</div>
<div id="visualizer_wrapper">
<canvas id='canvas' width="800" height="350"></canvas>
</div>
</div>
<footer>
</footer>
<div class="audioPlayer">
<button type="button" class="play">play</button>
<button type="button" class="pause">pause</button>
<button type="button" class="playatTime">play at 35 seconds</button>
<button type="button" class="volumestop">Volume to 0</button>
<button type="button" class="volumeMax">Volume open</button>
这是我的按钮在javascript文件中使用的位置,该文件在代码的134行上:https://jsfiddle.net/4hty6kak/16/
_visualize: function(audioContext, buffer) {
audioBufferSouceNode = audioContext.createBufferSource(),
analyser = audioContext.createAnalyser(),
that = this;
//connect the source to the analyser
audioBufferSouceNode.connect(analyser);
jQuery('.play').click(function() {
audioBufferSouceNode.start();
});
jQuery('.pause').click(function() {
audioBufferSouceNode.stop();
});
jQuery('.volumeMax').click(function() {
audioBufferSouceNode.volume=1;
});
jQuery('.volumestop').click(function() {
audioBufferSouceNode.volume=0;
});
jQuery('.playatTime').click(function() {
audioBufferSouceNode.currentTime= 35;
audioBufferSouceNode.play();
});
//connect the analyser to the destination(the speaker), or we won't hear the sound
analyser.connect(audioContext.destination);
//then assign the buffer to the buffer source node
audioBufferSouceNode.buffer = buffer;
//play the source
if (!audioBufferSouceNode.start) {
audioBufferSouceNode.start = audioBufferSouceNode.noteOn //in old browsers use noteOn method
audioBufferSouceNode.stop = audioBufferSouceNode.noteOff //in old browsers use noteOn method
};
//stop the previous sound if any
if (this.animationId !== null) {
cancelAnimationFrame(this.animationId);
}
if (this.source !== null) {
this.source.stop(0);
}
audioBufferSouceNode.start(0);
this.status = 1;
this.source = audioBufferSouceNode;
audioBufferSouceNode.onended = function() {
that._audioEnd(that);
};
this._updateInfo('Playing ' + this.fileName, false);
this.info = 'Playing ' + this.fileName;
document.getElementById('fileWrapper').style.opacity = 0.2;
this._drawSpectrum(analyser);
},
完整代码:
https://jsfiddle.net/4hty6kak/16/
我试过使用
audioBufferSouceNode.source.start();
和
audioBufferSouceNode.source.stop();
相反,但仍然行不通!
你有什么解决办法?以这种速度,我不在乎您有什么解决方案,即使它使用的是jQuery。简单明了的东西。
最佳答案
您只能在start
上使用audioBufferSourceNode
一次,并且通常只能对web audio API
的大多数源节点使用。参见http://webaudio.github.io/web-audio-api/#widl-AudioBufferSourceNode-start-void-double-when-double-offset-double-duration
因此,如果您想要这些行为,则需要更改逻辑,这意味着您必须在启动时重新创建节点。我制作了一个勉强可行的版本,只是为了展示您的工作方式,但是正如我所说的,如果您希望它能正常工作,则需要对代码进行一些重要的重构。
但基本上,您应该有一个start方法来创建音频节点并进行连接。在您的情况下,_visualize
不太远,因此在示例中,我在启动时调用了_visualize
。但是很明显,它会引起其他问题,例如单击事件。
而且,您必须查看需要回收哪些对象,可以保留一些对象(例如analyser
),而不要保留一些对象,因此也必须进行分类。
_visualize: function (audioContext, buffer) {
audioBufferSouceNode = audioContext.createBufferSource();
that = this;
//connect the source to the analyser
audioBufferSouceNode.connect(analyser);
jQuery('.play').click(function () {
audioContext.decodeAudioData(fileResult, function (buffer) {
that._updateInfo('Decode succussfully,start the visualizer', true);
that._visualize(audioContext, buffer);
}, function (e) {
that._updateInfo('!Fail to decode the file', false);
console.log(e);
});
});
https://jsfiddle.net/h3yvp0zw/4/
再次,这只是一个例子,运行不佳,几次单击后,可视化工具由于某种原因(可能是单击事件过多)而掉落。只是为了显示问题所在。
编辑:
也许更好的方法是使用
mediaElementSourceNode
而不是audioBufferSourceNode
。 mediaElementSourceNode
允许将常规HTML Audio Element
馈入上下文,从而应用效果和/或分析器。这允许使用HTML Audio element
的常规控件,例如播放和暂停。IT以这种方式工作:
首先创建一个音频元素。
var audioElement = new Audio('sourcefile');
然后,您的
mediaElementSource
引用您的元素:var source = audioContext.createMediaElementSource(audioElement);
然后
connect
到您的analyser
:source.connect(analyser);
并将您的行为应用于元素:
audioElement.play();
audioElement.pause();
等等
请注意,虽然audio元素可以与跨域文件一起使用,但
mediaElementSource
并非如此。安全性是不同的,如果在音频元素上使用跨域文件,则音频元素可能会播放,但是一旦将其提供给mediaSourceElement,它将停止,它只会输出静音。这意味着您需要修改文件的处理方式,可能需要将它们放在服务器上,然后将路径输入到音频元素。
关于javascript - 为什么我的start()和stop()方法不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31224278/