服务器和浏览器之间的语音聊天

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (62)

我之前在两个node.js服务器之间进行了语音聊天,这很有效,但现在我想在node.js服务器和浏览器之间进行。怎么可以这样做? 从node.js到node.js我通过TCP连接使用原始PCM流。 对于浏览器来说,这可能不会那么容易,对吧?我是否必须将流转换成什么格式以及如何转换?我应该使用什么协议?是否有任何有用的库来实现这一目标?

我设法将浏览器麦克风输入管道传输到浏览器扬声器输出,如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>

<!-- alternative method that also works
<audio></audio>
<script>
navigator.mediaDevices.getUserMedia({ audio: true }).then(function(stream) {
    const audio = document.querySelector('audio')
    audio.srcObject = stream
    audio.onloadedmetadata = function(e) {
        audio.play()
    }
}).catch(console.error)
</script>
-->
<script>
    navigator.mediaDevices.getUserMedia({audio: true}).then(stream => {
        const aCtx = new AudioContext()
        const analyser = aCtx.createAnalyser()
        const microphone = aCtx.createMediaStreamSource(stream)
        microphone.connect(analyser)
        analyser.connect(aCtx.destination)
    }).catch(err => {
        console.error("Error getting audio stream from getUserMedia")
    })
</script>

</body>
</html>

如你所见,我找到了两个解决方案。我将尝试将节点< - >浏览器语音聊天基于第二个。

对于Node.js,我提出了这个代码来将node.js mic输入传递给node.js扬声器输出:

const mic = require('mic')
const Speaker = require('speaker')

const micInstance = mic({ // arecord -D hw:0,0 -f S16_LE -r 44100 -c 2
    device: 'hw:2,0',           //   -D hw:0,0
    encoding: 'signed-integer', //             -f S
    bitwidth: '16',             //                 16
    endian: 'little',           //                   _LE
    rate: '44100',              //                       -r 44100
    channels: '1',              //                                -c 2
    debug: true
})
const micInputStream = micInstance.getAudioStream()

const speakerInstance = new Speaker({ // | aplay -D plughw:CARD=0,DEV=0
    channels: 1,
    bitDepth: 16,
    sampleRate: 44100,
    signed: true,
    device: 'plughw:2,0' //'plughw:NVidia,7'
})
speakerInstance.on('open', ()=>{
    console.log("Speaker received stuff")
})


micInputStream.pipe(speakerInstance)
micInputStream.on('data', data => {
    //console.log("Recieved Input Stream: " + data.length)
})
micInputStream.on('error', err => {
    cosole.log("Error in Input Stream: " + err)
})
micInstance.start()

console.log('Started')

如果您不熟悉Linux下的ALSA,那么找到合适的麦克风和扬声器设备可能会有点棘手。 我不确定它在Windows和Mac OS上是如何工作的。

我想出了一个小测试应用程序来连接这两个想法使用socket.io-stream(一个socket.io库,允许通过套接字发送流):https://github.com/T-vK/node-browser-音频流测试

(README.md包含如何设置它的说明,如果你想测试它。相关代码在server.js(setupStream()函数包含有趣的代码。)和client.html。

正如您所看到的,我正在尝试通过连接发送双工流,并将麦克风输入传输到流中,并将流传输到每端的扬声器。 它不起作用。 我不确定我是否真的需要两个双工流,但我认为应该做的工作。

提问于
用户回答回答于

一个你必须运行的Library socket.io和一个最好的教程在这里。你可以学习它,然后在node.js中创建聊天应用程序然后启动语音聊天应用程序

用户回答回答于

您不应该直接使用原始PCM流将浏览器和nodejs应用程序连接在一起。它很快就会变得非常浪费。

另一方面,什么在节点中工作,可能或无法在浏览器中工作(去检查你的回购看看你想要做什么,并检查我是否可以在那里检查一些东西)“

另一个解决方案是使用一种服务器 - 比如icecast - 这会使所有后端/数据变得非常粗糙。然后,您只需使用html标记通过Web浏览器进行交互。

检查一下 - >()我有一个链接溢出相关线程的链接,但我丢了IT Lol()

扫码关注云+社区

领取腾讯云代金券