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

В настоящее время я разрабатываю среду типа рации. Запись и передискретизация звука теперь работают нормально (спасибо за помощь), воспроизведение работает... вроде.

Мои данные поступают в виде (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 попробует и отчитается. Хотя ИМХО смысла особого нет, т.к. я создаю новые буферы, а новые 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 доступны в буферах и готовы к воспроизведению) воспроизведение должно начаться без задержки. Мы говорим о небольших независимых выборках, максимум 100 тысяч. Точно так же это работает для первого семпла, добавляя крошечную долю задержки к любым последующим семплам - добавляя до секунды или около того после 4 или 5 сэмплов и так далее. - person Michaela.Merz; 21.12.2013
comment
start(0) и start(context.currentTime) семантически эквивалентны. - person cwilso; 23.12.2013

Микаэла, это больше похоже на то, что это может быть проблема в источнике - вы уверены, что каждый входящий BLOB-объект правильный (правильной длины и имеет звук в начале?) Похоже, что вы просто добавляете новый запись в конец пустого буфера на этом конце. За исключением этой конкретной проблемы, я бы посмотрел на поступающий звуковой блок - может быть, декодирование по каким-то причинам слишком дорого? (То есть, если у вас есть 2-3-секундная кумулятивная задержка, вы должны быть в состоянии определить из регистрации, связана ли задержка с получением данных, их декодированием или в самом буфере.

person cwilso    schedule 23.12.2013
comment
Я посмотрел на это. Каждое аудио, воспроизводимое независимо, начинается сразу (после перезагрузки страницы), логирование показывает теперь задержки - это загадка :) Но один, я собираюсь решить :D - person Michaela.Merz; 24.12.2013