2013-06-17 3 views
10

Jedną z rzeczy, które najbardziej uwielbiam w formacie MOD, jest możliwość powrotu do dowolnego punktu w utworze, co czyni go idealnym do piosenek, które mają "wstęp", a następnie " główna pętla".Bezproblemowa pętla audio do dowolnej pozycji

Oczywiście MP3 nie może tego zrobić.

Do tej pory robiłem takie rzeczy:

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

Jeżeli wartość pływak jest czas, w którym główne rozpoczyna pętlę.

Podczas tej operacji pojawia się zauważalna pauza w ułamku sekundy po ponownym uruchomieniu audio. Mogę złagodzić efekt tej pauzy, ustawiając docelowy czas trochę wcześniej, niż powinien, więc rytmy są przynajmniej utrzymywane bliżej czasu, jednak nie jest to idealne.

Główną alternatywą, którą mogę wymyślić, jest ręczne zapętlenie pliku audio (np. W Audacity przez wklejenie), aby wytworzyć utwór dłuższy niż byłby najprawdopodobniej potrzebny, ale problem z tym jest spowodowałoby to dużo zmarnowanej przestrzeni dyskowej i przepustowości, a to nie rozwiązałoby problemu osób lubiących piosenkę i zatrzymujących się na jej słuchanie przez długi czas.

Więc zastanawiałem się, czy istnieje sposób na pętlę strumienia MP3. Jeśli poprawnie zrozumiem format, powinienem móc określić, w jakiej pozycji w pliku (w bajtach) zaczyna się główna pętla (w sekundach), więc teoretycznie mógłbym skonstruować strumień, który pętałby się w nieskończoność. Czy jednak taki strumień będzie obsługiwany przez dźwięk HTM5?

+0

Czy widziałeś [tę stronę o pętli bez przerw?] (Http://www.compuphase.com/mp3/mp3loops.htm) Nie obejmuje ona html5, ale mówi o teorii tego, co musi być w pliku mp3, aby mieć szansę na zapętlenie. – AShelly

+0

@AShelly Chociaż jest to interesujące, dotyczy to tylko plików, które mają być zapętlone z powrotem na początek, a nie do dowolnego punktu. –

+0

Pomyślałem, że powinienem wskazać to inne pytanie SO: [Looping Audio HTML5] (http://stackoverflow.com/questions/7330023/gapless-looping-audio-html5) –

Odpowiedz

1

Spróbuj za każdym razem pomiar opóźnienia:

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); 

Było lepiej, ale nie do końca dokładne, więc trzeba dostosować * 2.35 lub sprawiają, że odejmowanie czy coś.

+0

SeamlessLoop używa podobnej strategii. Znalazłem to w Internecie https://github.com/Hivenfour/SeamlessLoop/blob/master/SeamlessLoop.js. – user568109

+0

Interesujące podejście! –