Закъснения след възпроизвеждане на множество последователни аудио файлове

В момента разработвам среда тип уоки-токи. Записът и повторното семплиране на аудио работят добре сега (благодаря за помощта), възпроизвеждането работи .. нещо като.

Данните ми идват в (WAV-) петна, така че ето какво правя:

audioPlay(blob)
{
        var fileReader = new FileReader();
        fileReader.onload = function() {
                theContext.decodeAudioData(this.result, function(buffer) {
                        var source = theContext.createBufferSource(); 
                        source.buffer = buffer;
                        source.connect(theContext.destination);
                        source.start(0);
                        });
                };
        fileReader.readAsArrayBuffer(blob);
}

Но всяко ново аудио добавя леко забавяне при стартиране, което нараства с всяко ново аудио. След няколко аудиозаписа забавянето се увеличава с почти 2-3 секунди. Регистрирането не показва никакви забавяния, програмата протича добре по целия път до .source.start.

Някакви идеи?


person Michaela.Merz    schedule 20.12.2013    source източник


Отговори (2)


Не започвайте възпроизвеждането си от 0 за всяка проба. Вместо това следете времето.

 if (nextTime == 0) { nextTime = context.currentTime }
 source.start(nextTime);
 nextTime+=source.buffer.duration; 
person Brad.Smith    schedule 21.12.2013
comment
Благодаря, @Brad ще опита това и ще докладва. Въпреки че IMHO наистина няма смисъл, защото създавам нови буфери и нови source.connects - напълно независими процеси. - person Michaela.Merz; 21.12.2013
comment
audioPlay има две последователни асинхронни операции вътре в него. Обратното извикване на събитие fileReader.onload е асинхронно, а decodeAudioData е асинхронно. Наистина не можете да очаквате предвидимо време по този начин. Ето защо обаждането на source.start(0) не работи. - person Kevin Ennis; 21.12.2013
comment
@KevinEnnis Не те следвам. Не очаквам точно или предвидимо време. Предполагам, че след като зареждането е направено и decodeAudioData е направено (pcm данните са налични в буферите и са готови за възпроизвеждане), възпроизвеждането трябва да започне без забавяне. Говорим за малки, независими проби, най-много 100K. Което е точно как работи за първата проба, добавяйки малка част от забавянето към всички следващи проби - добавяйки до секунда или така след 4 или 5 проби и така нататък. - person Michaela.Merz; 21.12.2013
comment
start(0) и start(context.currentTime) са семантично еквивалентни. - person cwilso; 23.12.2013

Михаела, това звучи по-скоро като проблем в източника - сигурна ли си, че всеки входящ петно ​​е правилен (с правилна дължина и има аудио в началото?) Изглежда, че може просто да захващаш новия запис в края на празен буфер в този край. Като изключим този конкретен проблем, бих погледнал аудио петното, което идва - може би декодирането е твърде скъпо по някакви причини? (Т.е. ако имате кумулативно забавяне от 2-3 секунди, трябва да можете да разберете от регистрирането дали забавянето е в получаването на данните, декодирането им или в самия буфер.

person cwilso    schedule 23.12.2013
comment
Погледнах това. Всяко аудио, което се възпроизвежда независимо, започва веднага (след презареждане на страницата), регистрирането показва сега забавяния - това е мистерия :) Но първо, аз ще реша така: D - person Michaela.Merz; 24.12.2013