2013-06-17 5 views
10

Eines der Dinge, die ich am meisten Liebe über das MOD-Format ist die Fähigkeit, in einer Schleife zurück zu einem bestimmten Punkt im Song, es perfekt für Songs zu machen, die ein „Intro“ haben, gefolgt von einem " Hauptschleife".Seamless Audio-Loop auf eine beliebige Position

Natürlich kann MP3 das nicht tun.

Bisher habe ich so gemacht Dinge:

<audio src="/path/to/song.mp3" onEnded="this.currentTime = 12.345;"></audio> 

Wo der Schwimmer Wert der Zeit die Hauptschleife beginnt, bei der.

Das funktioniert zwar gibt es eine spürbare Bruch-of-a-Sekunden-Pause als Audio neu gestartet. Ich kann den Effekt dieser Pause verringern, indem ich die Zielzeit ein wenig vorstelle, wo sie sein sollte, also werden die Beats zumindest näher beieinander gehalten, aber es ist nicht wirklich ideal. Die Alternative, die mir in den Sinn kommt, ist, die Audiodatei manuell zu loopen (zB in Audacity durch Kopieren und Einfügen), um einen Song zu erzeugen, der länger ist, als er wahrscheinlich benötigt würde, aber das Problem dabei ist Das würde viel Speicherplatz und Bandbreite verschwenden, und es würde nicht das Problem lösen, dass Leute einen Song mögen und aufhören, ihn für eine lange Zeit zu hören.

Also ich frage mich, ob es eine Möglichkeit gibt, einen MP3-Stream zu loopen. Wenn ich das Format richtig verstehe, sollte ich in der Lage sein zu bestimmen, an welcher Stelle in der Datei (in Bytes) die Hauptschleife beginnt (in Sekunden), also könnte ich theoretisch einen Strom konstruieren, der unendlich lange läuft. Wird ein solcher Stream jedoch von HTM5-Audio unterstützt?

+0

haben Sie [diese Seite auf gapless Looping?] Gesehen (http://www.compuphase.com/mp3/mp3loops.htm) Es ist nicht html5 nicht bedeckt, aber es hat über die Theorie der reden, was sein muss in der mp3-Datei, um eine Chance zum Looping zu haben. – AShelly

+0

@AShelly Das ist zwar interessant, gilt aber nur für Dateien, die an den Anfang und nicht an einen beliebigen Punkt zurückgeschleift werden sollen. –

+0

dachte nur nehme ich dieses andere Punkt SO Frage aus: [Looping Audio HTML5] (http://stackoverflow.com/questions/7330023/gapless-looping-audio-html5) –

Antwort

1

Versuchen Sie, die Verzögerung jedes Mal messen:

function playSeamless(clip, next) { 
    if(!next) { 
     next = clip.cloneNode(true); 
     next.controls = false; 
    } 

    var start = Date.now(); 
    clip.play(); 

    setTimeout(function() { 
     var time = (Date.now() - start)/1000; 
     var position = clip.currentTime; 
     var delay = time - position; 

     setTimeout(function() { 
      // Set desired currentTime on next here and adjust delay above 
      playSeamless(next, clip); 
     }, (clip.duration - clip.currentTime - delay * 2.35) * 1000 | 0); 
    }, 200); 
} 

playSeamless(yourAudioClip); 

Es war besser, aber nicht ganz korrekt, also muss ich * 2.35 einzustellen oder eine Subtraktion oder etwas zu machen.

+0

SeamlessLoop verwendet ähnliche Strategie. Gefunden auf dem Netz https://github.com/Hivenfour/SeamlessLoop/blob/master/SeamlessLoop.js. – user568109

+0

Interessanter Ansatz! –