二进制流 - Node.js MP3音频流及播放回放

6
我可以帮助您翻译以下内容:

我想从客户端向服务器流传一个mp3文件,两者都在使用NodeJS。我正在使用binaryjs来进行文件流操作。

客户端:

var BinaryClient = require('binaryjs').BinaryClient;
var fs = require('fs');

var client = BinaryClient('ws://localhost:9000');
    client.on('open', function(stream){

       client.send(fs.createReadStream('music.mp3'), {
           name : 'music'
       });
});

服务器:

var BinaryServer    = require('binaryjs').BinaryServer;
var server = BinaryServer({port: 9000});
    server.on('connection', function(client){

        client.on('stream', function(stream, meta){

            var data = [];
            stream.on('data', function(chunk){
                console.log('Recieve Chunk: ' + data.length);
                data.push(chunk);
            });

            stream.on('end', function() {
                console.log('complete data' + data);
            });
        });
    });

我有一串二进制数据流,想要使用类似于player.js的工具在nodejs中直接输出音频。但是我不知道如何将这些二进制数据转换为可用的流文件,并与player.js等解决方案配合使用。希望有人能帮助我找到一个可行的解决方案。谢谢!

你有这个问题的解决方案吗? - Gaurav Tewari
1个回答

0

对于所有需要解决类似问题的人:

  1. 尝试在收集数据时立即从数据数组创建新的BlobFile,而不是在最后
  2. 将Blob作为ArrayBuffer读取
  3. 解码音频数据
  4. 播放它们

这里是一个片段:

   ....

   var context = new (window.AudioContext || window.webkitAudioContext)();
   var fileReader = new FileReader();
   var source = null;
   var audioBuffer = null;

   var data = [];
        stream.on('data', function(chunk){
            console.log('Recieve Chunk: ' + data.length);
            data.push(chunk);
            var blob = new Blob(streamData);
            fileReader.readAsArrayBuffer(blob);
            context.decodeAudioData(buf, function(buffer) {
                 audioBuffer = null;
                 audioBuffer = buffer;
                 source = context.createBufferSource();
                 source.buffer = audioBuffer;
                 source.connect(context.destination);
                 source.start()
        });


    ....

没有经过测试,可能无法正常工作,但我希望它能够帮助你们中的一些人


在执行decodeAudioData之前,您必须等待Buffer使用fileReader.onloadend完全填充。 - klanm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接