Перекрывающиеся части при буферизации mp3

Я пытаюсь передать файл MP3 с сервера nodeJS с помощью BinaryJS — http://binaryjs.com/

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

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

Сервер:

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

person Ronco    schedule 22.08.2015    source источник


Ответы (1)


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

person Raymond Toy    schedule 26.08.2015