我正在尝试使用电子播放来自洪流的流声音。为此,我使用https://github.com/feross/webtorrent下载电子主过程中的所有数据。然后,当我选择要下载的声音时,我会获得要播放的文件流,并在以下函数中发送到html渲染器进程
ipc.on('getPlayData', function(event, data){
console.log('get file data stream');
in_play = data[1];
//Crea el stream del archivo que se va a reproducir
var streamfile = downloaderInstance.getFileToPlay(data[0], data[1]).createReadStream();
//se envia la longiud del archivo en bytes para el buffer.
event.sender.send('toPlay', [downloaderInstance.getFileToPlay(data[0], data[1]).name,
downloaderInstance.getFileToPlay(data[0], data[1]).length]);
streamfile.on('data', function(chunk){
event.sender.send('addData', chunk);
});
其中'toPlay'消息告诉需要放入html的文件的渲染器参数,数据发送我从torrent的播种器获得的每个数据。
然后在渲染器procces中我将数据放入缓冲区以与https://github.com/feross/render-media一起使用,但我也尝试使用javascript的WebAudioApi。我在以下函数中管理数据:
ipc.on('toPlay', (event, data) => {
console.log("to play: " + data[0]);
var buf = [];
var stream_length = parseInt(data[1]);
var stream_data = Buffer.alloc(stream_length);
ipc.on('addData', (event, data) => {
buf.push(data);
stream_data = Buffer.concat(buf);
})
var file = {
name: data[0],
createReadStream: function(opts){
//console.log(stream_data.length);
return from( [stream_data.slice(0, stream_length) ]);
}
}
//console.log(file.createReadStream);
render.render(file, 'audio', [true, true, stream_length], function(err, elem){
if(err){ return console.log('error appending') }
})
})
其中render是一个在音频DOM节点中播放媒体源的函数。我的问题是我保留缓冲区中文件的完全内存,将渲染函数设置为文件的完整持续时间,但它只播放我已下载的数据,而不是在ipc收到新闻时重新加载数据我可以找不到办法。
答案 0 :(得分:0)
解决方案是
var readableStream = new Readable();
var file = {
name: data[0],
createReadStream: function(opts){
return ReadableStream;
}
}
但应该在返回之前完全加载可读性。