节点 - 我如何通过管道传输到新的可读流?
Node - how can i pipe to a new READABLE stream?
我的应用程序应该从客户端获取网络音频流,将其编码为 MP3,然后通过 WebSocket 将其发送回客户端。
我目前可以编码并通过管道传输到这样的文件:
inbound_stream.pipe(encoder).pipe(fs.createWriteStream('audio.mp3'));
如果我已经在服务器上有一个文件,我可以这样做:
var mp3File = fs.createReadStream('audio.mp3');
mp3File.on('data', function(buffer){
io.sockets.emit('audio', { buffer: buffer });
});
但是,我想实时访问编码块,并将它们发送给客户端 - 不写入文件。
我想要的是这个,有效:
inbound_stream.pipe(encoder).pipe(newReadStream);
newReadStream.on('data', function(buffer){
io.sockets.emit('audio', { buffer: buffer });
});
我看过 Duplex 和 Transform 流,但坦率地说,我仍在学习,Prototyping 让我头晕目眩。
我该怎么做?谢谢
更新
下面来自@Nazar Sakharenko 的解决方案确实满足了我的要求,但实时编码的开销似乎使这成为不可能,因此编写编码的 MP3 并对其进行预缓冲似乎是唯一的方法(感谢很多人的建议。)
但是我对这种方法仍然有问题。这里有新问题:
node.js - create a new ReadStream for a new file, when that file reaches a certain size
根据文档 readable.pipe(destination[, options]) 目的地应该是 stream.Writable.
你可以做的是实现你自己的可写流:
const Writable = require('stream').Writable;
var buffer = [];
//in bytes
const CHUNK_SIZE = 102400; //100kb
const myWritable = new Writable({
write(chunk, encoding, callback) {
buffer += chunk;
if(buffer.length >= CHUNK_SIZE) {
io.sockets.emit('audio', { buffer: buffer});
buffer = [];
}
callback();
}
});
myWritable.on('finish', () => {
//emit final part if there is data to emit
if(buffer.length) {
io.sockets.emit('audio', { buffer: buffer});
}
});
inbound_stream.pipe(encoder).pipe(myWritable);
就这些了。
我的应用程序应该从客户端获取网络音频流,将其编码为 MP3,然后通过 WebSocket 将其发送回客户端。
我目前可以编码并通过管道传输到这样的文件:
inbound_stream.pipe(encoder).pipe(fs.createWriteStream('audio.mp3'));
如果我已经在服务器上有一个文件,我可以这样做:
var mp3File = fs.createReadStream('audio.mp3');
mp3File.on('data', function(buffer){
io.sockets.emit('audio', { buffer: buffer });
});
但是,我想实时访问编码块,并将它们发送给客户端 - 不写入文件。
我想要的是这个,有效:
inbound_stream.pipe(encoder).pipe(newReadStream);
newReadStream.on('data', function(buffer){
io.sockets.emit('audio', { buffer: buffer });
});
我看过 Duplex 和 Transform 流,但坦率地说,我仍在学习,Prototyping 让我头晕目眩。
我该怎么做?谢谢
更新
下面来自@Nazar Sakharenko 的解决方案确实满足了我的要求,但实时编码的开销似乎使这成为不可能,因此编写编码的 MP3 并对其进行预缓冲似乎是唯一的方法(感谢很多人的建议。)
但是我对这种方法仍然有问题。这里有新问题:
node.js - create a new ReadStream for a new file, when that file reaches a certain size
根据文档 readable.pipe(destination[, options]) 目的地应该是 stream.Writable.
你可以做的是实现你自己的可写流:
const Writable = require('stream').Writable;
var buffer = [];
//in bytes
const CHUNK_SIZE = 102400; //100kb
const myWritable = new Writable({
write(chunk, encoding, callback) {
buffer += chunk;
if(buffer.length >= CHUNK_SIZE) {
io.sockets.emit('audio', { buffer: buffer});
buffer = [];
}
callback();
}
});
myWritable.on('finish', () => {
//emit final part if there is data to emit
if(buffer.length) {
io.sockets.emit('audio', { buffer: buffer});
}
});
inbound_stream.pipe(encoder).pipe(myWritable);
就这些了。