使用“假” /stream.mp3端点(node.js)进行一对多音频广播的可行性

时间:2019-05-21 13:40:13

标签: node.js audio socket.io webrtc audio-streaming

我想尝试在舒适区域之外的东西,并制作“在线广播应用程序”的原型。

然后我陷入了WebRTC流,媒体服务器,WebRTC网关,P2P网络图的麻烦之中……

似乎WebRTC不适合此类任务。在大多数浏览器中,它仅限于10个对等体。扩展WebRTC还需要大量观看者的大量工作。 例如: WebRTC - scalable live stream broadcasting / multicasting

然后我想到,一段时间以来,没有JavaScript的简单实时音频流就以这种形式存在:

http://stream.radioreklama.bg/radio1.opus

此类流的客户端可以简单地是简单的html <audio>标签。

现在我要做的就是创建一个“魔术” URL,其中有实时音频流。使用Node.js可以做到吗?

创建我的原型的缺失部分是:

1:从客户端(广播者)向服务器发送“实时”音频流(使用getUserMedia和socket.io)。

2:使用正确的编码将此音频流传输到“ /stream.mp3”URL。

如果可行,我认为这将是解决大规模一对多音频流问题的有趣方法,但也许我缺少一些核心信息。

理想客户:

import io from 'socket.io-client';
const socket = io.connect('//localhost:8888');

// Broadcasting code
navigator.mediaDevices
.getUserMedia({ audio: true, video: false })
.then(userMediaStream => {

  const mediaRecorder = new MediaRecorder(userMediaStream, {mimeType: 'audio/webm'});

  mediaRecorder.ondataavailable = event => {
    socket.emit('sound-blob', event.data);
  }

  mediaRecorder.start();
})



// Could be just a static html file
const App = () => (
  <div>
    <h1>Audio streaming client</h1>
    <audio>
      <source src="http://example.com/stream.mp3" type="audio/webm" />
    </audio>
  </div>
)

理想的服务器:

const app = express();
const io = require('socket.io').listen(8888);
const stream = require('stream');

const audioStream = new stream.Readable();

var app = express();

app.get('/stream.mp3', (req, res) => {
  audioStream.pipe(res);
})


io.on('connection', (socket) => {
  socket.on('sound-blob', (blob) => {
    audioStream.push(blob);
  })
})


server = http.createServer(app);
server.listen(8080);

现在,ondataavailable事件仅在流结束时才触发,但是我认为可以将记录分成多个块并进行实时流处理。我不确定适合的方法。

一旦将流发送到服务器,在将其传送到/stream.mp3端点之前,可能需要进行一些编码/转换。我也不知道这是否有必要。

这甚至有可能做到吗?我没有看到任何陷阱吗?

感谢分享您的想法!

0 个答案:

没有答案