2015-12-29 8 views
0

Я чрезвычайно новичок в мире потоковой передачи Node, поэтому прошу прощения за недостаток информации.Web Audio API onended event не срабатывает

У меня есть простой сервер узла, который получает поток файлов (используя BinaryJS), а затем повторно передает его обратно клиенту как ArrayBuffer. По сути, предположим, что я получаю ArrayBuffer с сервера, и я хочу воспроизвести его. Я в настоящее время расшифровываю его, когда он приходит, создавая новый источник и планируя воспроизведение каждый раз. Кажется, все работает.

Однако я хочу запускать другую функцию каждый раз, когда заканчивается кусок. Событие «onended», похоже, не срабатывает. Может кто-нибудь помочь? Благодарю.

client.on('open', function() { 
    var stream = client.send(file) 
    client.on('stream', function(stream) { 
     var nextTime = 0.01 

     stream.on('data', function(data) { 
      console.log('Receiving data from server') 
      context.decodeAudioData(data, function(audioBuffer) { 
       var source = context.createBufferSource() 
       source.buffer = song[song.length-1] 
       source.connect(context.destination); 
       source.onended = function() { 
        console.log('Buffer depleted') 
       } 
       source.start(nextTime) 
       nextTime += audioBuffer.duration - 0.01 
      }) 
     }) 
     stream.on('end', function() { 
      console.log('End of stream, ' + current) 
     }); 
    }) 
}) 
+0

Какой браузер вы используете? Вы пробовали поставить .start раньше. – Gary

+0

@Gary Я нахожусь в Chrome 49, я попробовал это, но это не сработало. Я выяснил решение, хотя, я отправлю его в качестве ответа, может быть, вы могли бы сказать мне, если это правильно? – madebysid

ответ

0

После борьбы в течение достаточно долгого времени, и, глядя на много ответов в Интернете, я понял, что причина моего кода не работа, потому что я постоянно переписывания переменную «источник». Поскольку это был всего лишь экземпляр (указатель для людей C++), он указывал только на последний источник. По существу, он был перезаписан до Событие могло быть выполнено.

Я решил это путем «кэширования» всех источников и буферов в массивы.

client.on('open', function() { 
    var stream = client.send(file) 
    client.on('stream', function(stream) { 
     stream.on('data', function(data) { 
      console.log('Receiving data from server') 
      context.decodeAudioData(data, function(audioBuffer) { 
       sources.push(context.createBufferSource()) 
       song.push(audioBuffer) 
       sources[sources.length-1].buffer = song[song.length-1] 
       sources[sources.length-1].connect(context.destination); 
       sources[sources.length-1].onended = function() { 
        console.log('Buffer depleted') 
        current += 1; 
       } 
       sources[sources.length-1].start(nextTime) 
       nextTime += audioBuffer.duration - 0.01 
      }) 
     }) 
     stream.on('end', function() { 
      console.log('End of stream, ' + current) 
     }); 
    }) 
}) 

На этот раз, я фактически толкая эти значения в массиве «источников», и, следовательно, он не был переписан, и событие уволен правильно.

Я не уверен, что это самый эффективный способ (я не думаю, что это так), но сейчас он решает мою проблему.

Если у кого-то есть лучшее решение, дайте мне знать :)

Смежные вопросы