Я написал небольшой сервер nodeJS, который выводит системный звук, захваченный ffmpeg в Windows (используя DirectShow), в браузер в виде потокового файла MP3. Звук должен быть как можно более живым, с минимальной буферизацией или без нее, а эффект «пропуска» в звуке вполне приемлем.
Когда я воспроизводю звук в Chrome с помощью аудиотега HTML5, возникает задержка около 8-10 секунд при подключении к локальной сети с малой задержкой. Я подозревал, что это буфер на стороне клиента, и использовал Flash MP3-плеер на стороне клиента, что уменьшило задержку до 2-3 секунд.
Теперь буферизация, похоже, происходит на стороне сервера. В документации для NodeJS response.write упоминается, что данные записываются в буферы ядра. Как мне вообще избежать какой-либо буферизации или, по крайней мере, обойти ее, чтобы клиент всегда получал самые последние аудиоданные? Стратегии обработки событий «слива», чтобы всегда отправлять оперативные данные?
В объекте запроса я использовал setNoDelay(true) чтобы избежать использования алгоритма Нэгла. Ниже приведен фрагмент того, как записываются данные, когда порожденный процесс ffmpeg выдает данные.
var clients = []; //List of client connections currently being served
ffmpeg.stdout.on('data', function(data) {
for(var i = 0; i < clients.length; i++){
clients[i].res.write(data);
}
});