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

Jos*_*iah 12 javascript html5 javascript-events html5-audio

我正在开发iOS节拍器网络应用程序.由于移动safari一次只能播放一个声音,我正在尝试创建一个"音频精灵" - 我可以使用单个音轨的不同片段来生成不同的声音.我有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>
Run Code Online (Sandbox Code Playgroud)

JSFiddle上看到它.

正如您所看到的,我试图使用'timeupdate'事件(jPlayer示例)但无济于事.

我见过Remy Sharp关于音频精灵的帖子,但是(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();
}
Run Code Online (Sandbox Code Playgroud)

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

的jsfiddle

谢谢!

PS如果有人对此有一个解决方案,这可以用于游戏和界面声音FX.

Sam*_*ton 19

我认为这里有一些问题.

首先,每次用户单击"播放1"时,您都会添加一个事件侦听器.

我想也是

if (currentTime >= 0.5) { ...
Run Code Online (Sandbox Code Playgroud)

应该

if (audio.currentTime >= 0.5) { ...
Run Code Online (Sandbox Code Playgroud)

这也有效:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这是展示出色功能的绝佳解决方案。但是,请不要将间隔设置为整秒。我在Chrome中对其进行了测试,发现该浏览器在不道歉的情况下经常会超出间隔0.4秒。 (2认同)