2016-11-13 60 views
2

我試圖從使用電子的洪流播放流聲音。爲此,我使用https://github.com/feross/webtorrent來下載電子主要進程中的所有數據。後來,當我選擇一個聲音下載我得到的文件流播放和發送的HTML渲染proccess在後續功能創建一個緩衝區和管道數據來播放它javascript

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和數據發送每一個數據,我從種子播種機獲得。

然後在渲染器中處理我得到的數據到一個緩衝區與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') } 
    }) 
}) 

在那裏渲染它是起到音頻DOM節點的媒體源的功能。我的問題就是我在緩衝區中保留了文件的全部內存,將渲染函數設置爲文件的完整持續時間,但它只播放我已經下載的數據,並且在ipc收到新聞時不重新載入數據,我可以沒有辦法做到這一點。

+0

您可以使用Audio Object的''和'buffered'屬性。 –

+0

請你給我一些鏈接或例子。 @JuanjoSalvador – rafaelleru

+0

這可能會幫助你http://www.inserthtml.com/2013/03/custom-html5-video-player/ –

回答

0

的解決方案是

var readableStream = new Readable(); 

var file = { 
     name: data[0], 
     createReadStream: function(opts){ 
     return ReadableStream; 
     } 
    } 

但可讀應在返回之前完全加載。