2016-08-02 37 views
0

我的应用程序应该从客户端传输Web音频,将其编码为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 }); 
     }); 

我已经看了复式和变换流,但坦率地说,我仍然在学习和原型使我晕头转向。

我该怎么做?谢谢。

UPDATE

从@Nazar Sakharenko下面的解决方案当然不会是我想要的,而是实时编码开销似乎使这个inpossible,所以写编码的MP3,和预缓冲它似乎是唯一的(感谢各种人的建议)。

但是我仍然有这种方法的问题。新的问题在这里:

node.js - create a new ReadStream for a new file, when that file reaches a certain size

回答

0

根据文档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); 

多数民众赞成。

+0

非常感谢,我非常感谢。 它的工作,但不幸的是编码卡住了流,意味着它不能实时使用。我想知道我是否更好地写入文件,然后使用增长文件在达到一定大小后进行流式处理。 – user3174541

+0

我对MP3流不熟悉,可能你可以在内存中预先解压mp3的一些解码部分,并在最小尺寸解码后开始流式传输。 –

+0

你能解释你的工作流程吗? –

相关问题