HTML5音频:如何只播放音频文件的选定部分(音频精灵)?

时间:2011-05-09 04:11:27

标签: javascript html5 javascript-events html5-audio

我正在开发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();
}

序列和设置/清除间隔存在一些问题,但出于我的目的 - 似乎有效。

JSFiddle

谢谢!

P.S。如果有人对此有解决方法,可以在Games和Interface Sound FX中使用。

2 个答案:

答案 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