Подтвердить что ты не робот

HTML5 Audio: как воспроизводить только выбранную часть аудиофайла (аудио спрайт)?

Я работаю над веб-приложением метронома iOS. Так как мобильное сафари может воспроизводить только один звук за раз, я пытаюсь создать "аудио спрайт", где я могу использовать разные сегменты одной звуковой дорожки для генерировать разные звуки. У меня есть 1-секундный клип с двумя полусекундными звуками.

<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 на аудио спрайтах, но (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. Если у кого есть исправление для этого, это может быть использовано в играх и интерфейсе Sound FX.

4b9b3361

Ответ 1

Я думаю, что здесь есть пара проблем.

Во-первых, вы добавляете прослушиватель событий каждый раз, когда пользователь нажимает кнопку "Воспроизвести 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>