我正在开发iOS节拍器网页应用。由于移动safari只能播放one sound at a time,我正在尝试创建一个'音频精灵' - 我可以使用单个音轨的不同片段来生成不同的声音。我有1秒的剪辑,上面有2个半秒的声音。
<audio id="sample" src="sounds.mp3"></audio>
<a href="javascript:play1();">Play1</a>
<a href="javascript:play2();">Play2</a>
<a href="javascript:pauseAudio();">Pause</a>
<script>
var audio = document.getElementById('click');
function play1(){
audio.currentTime = 0;
audio.play();
// This is the problem area
audio.addEventListener('timeupdate', function (){
if (currentTime >= 0.5) {
audio.pause();
}
}, false);
}
function play2(){
audio.currentTime = 0.5;
audio.play();
}
function pause(){
audio.pause();
}
</script>
在JSFiddle上查看。
正如您所看到的,我试图使用'timeupdate'事件(jPlayer example)但无济于事。
我见过Remy Sharp's post on audio sprites,但是(A)我无法让它为我工作,而且(B)我宁愿远离库依赖。
有什么想法吗?在此先感谢您的帮助!
的更新 的
我现在使用setInterval
:
function play1(){
audio.currentTime = 0;
audio.play();
int = setInterval(function() {
if (audio.currentTime > 0.4) {
audio.pause();
clearInterval(int);
}
}, 10);
}
function play2(){
clearInterval(int);
audio.currentTime = 0.5;
audio.play();
}
序列和设置/清除间隔存在一些问题,但出于我的目的 - 似乎有效。
谢谢!
P.S。如果有人对此有解决方法,可以在Games和Interface Sound FX中使用。
答案 0 :(得分:19)
我认为这里存在一些问题。
首先,每次用户点击Play 1时,您都会添加一个事件监听器。
我也认为
if (currentTime >= 0.5) { ...
应该是
if (audio.currentTime >= 0.5) { ...
这也有效:
<audio id="sample" src="http://dl.dropbox.com/u/222645/click1sec.mp3" controls preload></audio>
<a href="javascript:playSegment(0.0, 0.5);">Play1</a>
<a href="javascript:playSegment(0.5);">Play2</a>
<script>
var audio = document.getElementById('sample');
var segmentEnd;
audio.addEventListener('timeupdate', function (){
if (segmentEnd && audio.currentTime >= segmentEnd) {
audio.pause();
}
console.log(audio.currentTime);
}, false);
function playSegment(startTime, endTime){
segmentEnd = endTime;
audio.currentTime = startTime;
audio.play();
}
</script>
答案 1 :(得分:0)
我没有找到一个干净的函数来播放音频对象的片段,所以这就是我想要的。如果用户在短时间内单击多个触发器,也会解决以下错误。
“未捕获(承诺)的DOMException:调用play()中断了play()请求”
-1