当前位置: 首页 > 知识库问答 >
问题:

使用node.jssocket.io通过webrtc广播现场音频

宋耀
2023-03-14

我正在尝试使用webrtc和socket通过getUserMedia()获取音频。io将其发送到服务器(socket.io支持音频、视频、二进制数据),然后服务器将其广播到所有连接的客户端。问题是,当流到达连接的客户端时,它会转换为JSON对象,而不是媒体流对象。所以我无法发送音频,我也尝试了套接字。io流模块,但我认为未成功。您能帮我正确捕获音频流并将其发送到所有连接的客户端吗。

下面是发送数据的客户端的代码

navigator.getUserMedia({audio: true, video: false}, function(stream) {
  video.src = window.URL.createObjectURL(stream);
  webcamstream = stream;
  media = stream; /// here the datatype of media is mediaStream object
  socket.emit("sendaudio", media);
}, function(e){
  console.log(error);
});

在接收客户端时,代码如下

socket.on('receiveaudio' , function(media)
{
   console.log(media); //but here i am receiving it as a simple object
   other.src= media;
});

共有1个答案

闾丘淇
2023-03-14

我从这里抄下了我的答案。

本示例向您展示了如何使用MediaRecorder上传音频,然后使用socket.io转发音频。此代码只会在调用mediaecorder.stop()后广播。您可以选择在ondata内部广播。如果您这样做,您可能希望将一个timeslice传递给mediaecorder.start(),这样它就不会经常触发ondata可用性

这个解决方案并不是真正的生活,但我认为它会帮助那些回来发现这个问题的人。

客户端代码

var constraints = { audio: true };
navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) {
    var mediaRecorder = new MediaRecorder(mediaStream);
    mediaRecorder.onstart = function(e) {
        this.chunks = [];
    };
    mediaRecorder.ondataavailable = function(e) {
        this.chunks.push(e.data);
    };
    mediaRecorder.onstop = function(e) {
        var blob = new Blob(this.chunks, { 'type' : 'audio/ogg; codecs=opus' });
        socket.emit('radio', blob);
    };

    // Start recording
    mediaRecorder.start();

    // Stop recording after 5 seconds and broadcast it to server
    setTimeout(function() {
        mediaRecorder.stop()
    }, 5000);
});

// When the client receives a voice message it will play the sound
socket.on('voice', function(arrayBuffer) {
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/ogg; codecs=opus' });
    var audio = document.createElement('audio');
    audio.src = window.URL.createObjectURL(blob);
    audio.play();
});

服务器代码

socket.on('radio', function(blob) {
    // can choose to broadcast it to whoever you want
    socket.broadcast.emit('voice', blob);
});
 类似资料:
  • 从插座上看。io网站 从1.0开始,可以来回发送任何Blob:图像、音频、视频。 我现在想知道,这是否能解决我最近想要实现的目标。 我其实是在寻找一种方法,如何直播音频流从(A-即,麦克风输入...)到所有客户连接到我的网站。像这样的事情可能吗?我一直在摆弄WebRTC(https://www.webrtc-experiment.com/)示例,但我无法为几个连接的客户端管理目标。 我的想法是关于

  • 请问,有任何简单的方法流(广播)媒体文件(ogg,mp3,SPX..)通过Node.js和Socket.io从服务器到客户机(浏览器)?

  • 问题内容: 我创建了一个服务器应用程序,该应用程序从客户端接收声音,然后广播此声音,该声音以字节存储,然后将字节发送回连接到服务器的客户端。现在,我目前仅使用一个客户端进行测试,客户端正在接收语音,但是声音一直在卡顿。有人可以告诉我我做错了吗? 我想我理解为什么声音播放不流畅但不了解如何解决问题的部分原因。 代码是波纹管的。 客户端: 将声音发送到服务器的部分 从服务器接收数据字节的部分 问题答案

  • 问题内容: 我正在研究通过多个Android设备之间的Wi-Fi Direct连接进行广播的可能性。我创建了一个简单的消息广播应用程序来测试它是否有效,但是到目前为止,我还无法广播消息。当我尝试发送数据包时,出现 SocketException (网络无法访问): 这是我的代码的本质: 有谁知道在 Android 设备上通过Wi-Fi Direct广播是否真的有效?如果它可以正常工作,我在做什么错

  • 本章介绍 UDP 介绍 ChannelHandler, Decoder, 和 Encoder 引导基于 Netty 的应用 前面的章节都是在示例中使用 TCP 协议,这一章,我们将使用UDP。UDP是一种无连接协议,若需要很高的性能和对数据的完成性没有严格要求,那使用 UDP 是一个很好的方法。最著名的基于UDP协议的是用来域名解析的DNS。这一章将给你一个好的理解的无连接协议所以你能够做出明智的

  • 我在android上使用APPRTCdemo应用程序。我试着让它播放来自另一个同龄人的声音,音量与Android设置中设置的音量一样大。因此,如果用户将设备静音,则不会听到音频。我几乎尝试了每一个Android API调用,但似乎对音量没有任何影响。以下是我尝试过的东西:AudioManager AudioManager=(AudioManager)_context.getSystemServic