Выполнение операций с каналами на отдельных кусках (node-wav)

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

Таким образом, file = fs.createReadStream(path) (filestream) отправляется в file.pipe(wavy) (удалить заголовки и выводить исходный PCM), попадает туда в .pipe(waver) (добавляет правильный заголовок wav в chunk), который .pipe(waver) по .pipe(waver) в .pipe(spark) (выпустить кусок клиенту).

Идея состоит в том, что каждый кусок файлового потока имеет заголовки, удаленные, если они есть (применим только к первому фрагменту), а затем с помощью узла-wav Writer этот кусок наделен заголовками и затем отправляется клиенту. Как я уверен, вы догадались, что это не сработает.

Трубные операции в node-wav действуют на весь поток, а не на отдельные куски. Чтобы подтвердить, что я проверил выходную клиентскую сторону и эффективно отбрасывает заголовки и повторно добавляет их во весь поток данных.

Из того, что я читал в документах Node Stream, похоже, что то, что я пытаюсь сделать, должно быть возможным, просто не так, как я это делаю. Я просто не могу понять, как это сделать.

Возможно ли, и если да, то чего я пропущу?

Полная функция:

processAudio = (path, spark) ->
 wavy = new wav.Reader()
 waver = new wav.Writer()
 file = fs.createReadStream(path)
 file.pipe(wavy).pipe(waver).pipe(spark)
1 ответ

Я действительно не знаю о wavs и заголовках, но если вы "пытаетесь обработать/трансформировать куски потока, когда они выходят из каждой трубы". вы можете использовать поток Transform.

Это позволяет вам сидеть между 2 потоками и изменять байты между ними:

var util = require('util');
var Transform = require('stream').Transform;
util.inherits(Test, Transform);

function Test(options) {
 Transform.call(this, options);
}

Test.prototype._transform = function(chunk, encoding, cb) {
 // do something with chunk, then pass a modified chunk (or not)
 // to the downstream
 cb(null, chunk);
};

Чтобы наблюдать за потоком и потенциально его модифицировать,

file.pipe(wavy).pipe(new Test()).pipe(waver).pipe(spark)

licensed under cc by-sa 3.0 with attribution.