当我将它传递给套接字 io 时,对象失去了它的原型功能

Posted

技术标签:

【中文标题】当我将它传递给套接字 io 时,对象失去了它的原型功能【英文标题】:Object losing its prototype functions when I pass it to socket io 【发布时间】:2020-09-14 21:14:38 【问题描述】:

我正在使用 Agora.io sdk 创建一个群组视频聊天应用程序。它们为开发人员提供了一个流对象,其中包含构建应用程序所需的重要方法和属性。但是,当我将它传递给套接字 io 时,它会失去其功能。我怎么解决这个问题。我看到一些提出类似问题的问题,但它们没有提供能够帮助我的答案。 下面是我发出的代码:

function UIControls (stream, streamType, streamDiv) 
    console.log('inside UIControls :::', stream.streamId, stream.getId(), typeof(stream) === 'function')

    // video button
    var videoButton = document.createElement('button');
    // videoButton.setAttribute('id', 'videoButton');
    videoButton.setAttribute('id', 'video_'+String(stream.getId()));
    videoButton.innerhtml = '<i class="fas fa-video"></i>';
    var clicked = false;
    videoButton.addEventListener('click', function(evt) 
        toggleVideo(stream);
    )
    if (streamType === 'me') 
        $('#me').append(videoButton);
     else 
        $('#' + String(stream.getId())).append(videoButton);
     

    function toggleVideo(stream) 
        if (clicked) 
            videoButton.innerHTML = '<i class="fas fa-video-slash"></i>';
            socket.emit("sendPeerInfo_video", 
                "type": "mute",
                "id": String(stream.getId()),
            );
            clicked = false;
         else 
            // stream.unmuteVideo();
            videoButton.innerHTML = '<i class="fas fa-video"></i>';
            socket.emit("sendPeerInfo_video", 
                "type": "unmute",
                "id": String(stream.getId()),
                "stream": stream,
            );
            clicked = true;
        
    


这里是 socket.on 代码:

socket.on("sendPeerInfo_video", function (evt) 
    if (evt.type === 'mute') 
        evt.stream.muteVideo();
        return $('#video_'+evt.id)[0].innerHTML = '<i class="fas fa-video-slash"></i>'
     else if (evt.type === 'unmute') 
        evt.stream.unmuteVideo();
        return $('#video_'+evt.id)[0].innerHTML = '<i class="fas fa-video"></i>'
    
);

我无法再在 socket.on 中访问 evt.stream.muteVideo() 和 evt.stream.unmuteVideo() 函数

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您使用自己的套接字有什么特别的原因吗?

查看此sample app,它负责群组视频通话和屏幕共享,以及使用官方Agora.io Documentation 制作的静音和取消静音等功能。

一个 sn-p 显示您实际需要为哪些功能执行的操作,并举例说明:

var client = AgoraRTC.createClient(mode: 'rtc', codec: 'vp8'); 
var localStreams = 
  uid: '',
  camera: 
    camId: '',
    micId: '',
    stream: 
  
;

// Hide video
client.on("mute-video", function (evt) 
  var remoteId = evt.uid;
   localStreams.camera.stream.muteVideo();
);

// Show video
client.on("unmute-video", function (evt) 
 localStreams.camera.stream.unmuteVideo();
);

// Mute audio
client.on("mute-audio", function (evt) 
  var remoteId = evt.uid;
   localStreams.camera.stream.muteAudio();
);

// Unmute audio
client.on("unmute-audio", function (evt) 
 localStreams.camera.stream.unmuteAudio();
);

Agora 会自动为所有人静音和取消静音,而无需您为相同的音频和视频制作自己的套接字。

如果您的用例有所不同,但需要您使用自定义套接字,请在 cmets 中告诉我。

编辑: 要实现举手功能以及将其他人静音或取消静音,您可以使用 Agora RTM 或 quick start guide 或 sample app。

RTM 的作用类似于您的个人网络套接字,可用于发送显示给其他用户(用于聊天)的消息,甚至可以在幕后进行一些工作,例如接收特定类型的消息并执行操作相应地。

如果管理员想要将其他人静音,他们可以单击一个按钮,该按钮会触发向用户发送 RTM 消息,然后自动解析并使用此消息将他/她静音。 举手将以类似的方式工作。

【讨论】:

是的,我的情况有点不同。 Agora 允许本地流将其音频和视频静音或取消静音。远程用户不能静音和取消静音某人的音频和视频。我还想实现一个举手功能-单击手按钮时,它会在远程流本地窗口中显示推送通知。所以我用我自己的 websockets 来实现这个功能。感谢您为我调查此问题! @JagnoorGrewal 我已经编辑了我的答案来帮助您解决问题。 感谢您的回答。我只是调查了一下,这就是我在转向 websockets 之前一直在寻找的东西。一定会实现这个

以上是关于当我将它传递给套接字 io 时,对象失去了它的原型功能的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - 传递给部分时未定义的局部变量,但当我将调试器放入 erb 文件时定义了它

将绑定传递给类型属性包装器的变量 - 失去基础类型

Ionic 2:当我将数组传递给组件时,我在 component.ts 上得到一个字符串

代码在我的系统上运行良好,但是当我将它提交给应该检查它的机器人时会导致堆栈粉碎错误

codeigniter 将 html 渲染为图像

当我将 JSON 对象架构传递给客户端时,它看起来不同