2015-08-22 3 views
0

Я пытаюсь поток MP3-файл с сервера nodeJS с помощью BinaryJS - http://binaryjs.com/перекрывающихся части в то время как буферная mp3

Но, когда я декодирование буферов на стороне клиента, они, кажется, перекрытие, это означает, что новый кусок данных воспроизводится за несколько миллисекунд до того, как закончился предыдущий, что привело к задержке звука.

есть ли способ заставить клиента ждать, пока текущий буфер не будет закончен, прежде чем запускать новый?

Сервер:

var BinaryServer = require('binaryjs').BinaryServer; 
var fs = require('fs'); 
var server = BinaryServer({port: 9000}); 

server.on('connection', function(client){ 

    var file = fs.createReadStream(__dirname + '/Song.mp3', { 
     'flags': 'r', 
     'bufferSize': 4 * 1024 
     }); 
    }); 

    client.send(file); 
}); 

Клиент:

var client = new BinaryClient('ws://localhost:9000'); 

window.AudioContext = window.AudioContext || window.webkitAudioContext; 
var context = new AudioContext(); 


client.on('stream', function (stream, meta) { 
    var parts = []; 
    var last = 0; 
    stream.on('data', function (data) { 

     var source = context.createBufferSource(); 
     context.decodeAudioData(data, function (buf) { 
       source.buffer = buf; 
       source.connect(context.destination); 
       source.loop = false; 
       source.start(last); 
       last += buf.duration; 
       source.onended = function() { 
       console.log('Your audio has finished playing'); 
      }; 
     }, 

     function (e) { 
      "Error with decoding audio data" + e.err 
     }); 
    parts.push(data); 
    }); 
    stream.on('end', function() { 
     console.log(parts); 
    }); 
}); 

ответ

0

Не уверен, что это, но вместо инициализации last 0, вы можете инициализировать его context.currentTime.