Eksperymentuję z portalem proste narzędzie audio o nazwie Voiceewalker do JavaScript . VoiceWalker to narzędzie, aby pomóc ludziom transkrybować dźwięk, a to działa:

Wzór gra Voicewalker http://i.imgur.com/rafgl.png

Więc pomysł jest taki, że gra trochę, powtarza go, skrapla się do przodu, odgrywa kolejny kawałek, powtarza, że skwalia się do przodu itp.

Zgrzegnęłam funkcję, aby odtworzyć klips dźwiękowy, wygląda tak:

function clip(audio, start, stop){
    audio.currentTime = start;
    audio.play();
    int = setInterval(function() {
        if (audio.currentTime > stop) {
            audio.pause();
            clearInterval(int);
        }
    }, 10);
}    

Jest to łatwa propozycja, aby wymyślić listę razy startu / zatrzymania, które pasują do wzoru powyżej, ale jest jeden problem:

6
user18015 9 październik 2011, 07:51

4 odpowiedzi

Najlepsza odpowiedź

Postępuj zgodnie z strukturą innego interfejsu API w JavaScript: Czy funkcja klipu również przynosi funkcję "Co zrobić następną". (Więcej technicznego terminu: "Callback"). Pomysł polega na tym, że funkcja klipu wie, kiedy robi się z jego pracą, a następnie może zadzwonić do zwrotnego w odpowiednim czasie.

Jako przykład, powiedzmy, że mamy funkcję, która powoli przeliteruje słowo do organu dokumentu:

var spell = function(word, onSuccess) {
    var i = 0;
    var intervalId = setInterval(function() { 
                    if (i >= word.length) { 
                        clearInterval(intervalId);
                        onSuccess();
                    } else {
                        document.body.appendChild(
                            document.createTextNode(word.charAt(i)));
                        i++;
                    }
                }, 100)
};

Gdy ta obliczenie wykończenia wyznaczają słowo, zadzwoni do onsuccess , co będzie naszym wywołanii zwrotnym. Kiedy mamy zaklęć () <), możemy spróbować go użyć:

var startIt = function() {
    spell("hello", afterHello);
};

var afterHello = function() {
    spell("world", afterHelloWorld);
};

var afterHelloWorld = function() {
    alert("all done!"); 
};

Spróbuj dzwonić Studeit , a zobaczysz, że to robi.

To podejście pozwala nam łączyć te asynchroniczne obliczenia. Każdy dobry ASynchroniczny ASynchroniczny API JavaScript pozwala zdefiniować "Co robić dalej" po tym, jak się obliczy. Możesz napisać własne funkcje, aby zrobić to samo.

5
dyoo 1 grudzień 2011, 21:33

Make clip Zadzwoń:

function clip(audio, start, stop){
    audio.currentTime = start;
    audio.play();
    int = setInterval(function() {
        if (audio.currentTime > stop) {
            audio.pause();
            clearInterval(int);
            // Play it again, 2 seconds further.
            clip(audio, start + 2, stop + 2);
        }
    }, 10);
}
6
icktoofay 9 październik 2011, 04:01
var count = 1;  //initialize and set counter
var clipstart = [0,10,20,30,40,50,60]; //initialize and set array of starting points
var clipend   = [5,15,25,35,45,55,65]; //initialize and set array of ending points
var clip = document.getElementById('clip'); //the clip you want to work with
var end; //initialize the current end point
var start; //initialize the current start point

function stop(){ //function to check if the clip needs to be stopped and asks for next track
  if(clip.currentTime >= end){
    clip.pause(); //pause playback
      //if it's not on the 2 iteration, and the there are still cues left ask for next track.
      if(!(count == 1 && clipstart.length == 0)){ 
          skip();
      }
  }
}

function play(){ //skip to start and play
  clip.currentTime = start;
  clip.play();
}

function skip(){ //sets the start and end points
  count++;
  if(count == 2){
    count = 0;
    start = clipstart.shift();
    end = clipend.shift();
  }  
  play();
}

skip();
clip.addEventListener('timeupdate', stop); //listens for if the clip is playing, and if it is, every second run the stop function.

Spójrz na IT

1
Last Rose Studios 26 listopad 2011, 14:04

Oto moduł, który zrobi to, co chcesz.

Jest to ustawione, aby odtwarzać dwie sekundy klipu dwa razy , z krótką pauzą pomiędzy, a następnie przesunąć punkt wyjścia pół sekundę , Pauza ponownie ponownie, a następnie zagraj w Dalej dwie sekundy od nowej punktu wyjścia, i tak dalej. (Możesz zmienić te ustawienia bardzo łatwo w nieruchomościach na górze).

Ten kod oczekuje, że istnieje element HTML z ID "Debug" - używałem tego akapitu. Możesz usunąć wszystkie odniesienie do tego elementu, jeśli chcesz. (Istnieją jeszcze cztery, linia, która zaczyna się var d ... i trzy linie, które rozpoczynają d.innerhtml ...).

var VOICEWALKER = (function () {
// properties
var d = document.getElementById("debug");
var audio = document.getElementsByTagName('audio')[0];
var start = 0;
var stop = 2;
var advanceBy = 0.5;
var pauseDuration = 500; // milliseconds between clips
var intv; // reference to the setInterval timer
var clipCount = 0; // how many times we have played this part of the clip
var clipMax = 2; // how many times we shall play this part of the clip

// methods
var pauseFinished = function () {
    d.innerHTML = "Pause finished";
    clip();
};

var pollClip = function () {

    d.innerHTML = String(audio.currentTime);

    if (audio.currentTime > stop) {
        audio.pause();
        d.innerHTML = "Pause";
        clearInterval(intv);

        clipCount += 1;
        if (clipCount === clipMax) {
            clipCount = 0;
            // advance clip
            start += advanceBy;
            stop += advanceBy;
        }

        // pause a little
        setTimeout(pauseFinished, pauseDuration);
    }


};

var clip = function () {
    audio.currentTime = start;
    audio.play();
    intv = setInterval(pollClip, 10);
};

var init = function () {
    audio.addEventListener('canplaythrough', clip, false);
};

return {
    init : init
};
}());

VOICEWALKER.init();
0
brennanyoung 1 grudzień 2011, 21:58