腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)

先阐述一下问题,在项目中用到腾讯云的TRTC,A端发布A1、A2两个视频源,在B端订阅A1、A2使用两个view进行播放渲染

问题主流视频源和辅流视频源渲染在同一view上,控制台报错

javascript 复制代码
// 播放远端视频 TRTCService.js;
setRemoteVideo(view) {
  this.trtcSdk.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => {
    if (event.streamType === TRTC.TYPE.STREAM_TYPE_MAIN) {
      console.log("开启主流视频源", view);
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view,
      });
    } else if (event.streamType === TRTC.TYPE.STREAM_TYPE_SUB) {
      console.log("开启辅流视频源", view);
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view,
      });
    }
  });
}

// vue组件中调用
this.setRemoteVideo(this.el_scan),
this.setRemoteVideo(this.el_other),

监听订阅远端视频事件里判断主流和辅流传不同的view实例,运行结果是主流和辅流视频渲染在同一个view上,控制台报错如下:

问题原因:

每次触发 REMOTE_VIDEO_AVAILABLE 事件时都会调用 startRemoteVideo 方法,但由于 on

事件监听器是全局的,每次调用 setRemoteVideo(view)

方法时,都会为同一事件添加一个新的监听器。因此,当触发该事件时,多个监听器会被执行,导致视频源被渲染在多个视图上

解决这个问题的步骤如下:

在 setRemoteVideo(view) 中移除旧的监听器: 每次调用 setRemoteVideo(view)时,先移除之前可能存在的监听器,防止重复监听

在事件监听器中判断 view 参数: 在触发事件时,根据传入的 view参数来区分主流视频源和辅流视频源,确保它们渲染到正确的视图上

代码如下:

javascript 复制代码
setRemoteVideo(view) {
  // 移除之前的监听器,防止重复监听
  this.trtcSdk.off(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE);
  
  this.trtcSdk.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => {
    if (view === this.el_scan && event.streamType === TRTC.TYPE.STREAM_TYPE_MAIN) {
      console.log("开启主流视频源");
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view,
      });
    } else if (view === this.el_other && event.streamType === TRTC.TYPE.STREAM_TYPE_SUB) {
      console.log("开启辅流视频源");
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view,
      });
    }
  });
}

运行结果:

控制台正常输出,但是主流视频源和辅流视频源还是渲染在同一个view上

继续分析:

由于两次调用 setRemoteVideo(view) 时,view 参数在 TRTC SDK内部没有正确区分,导致最后一次调用覆盖了前一次调用的效果。因此,尽管控制台只输出一次,但实际上两个视频流都渲染在了同一个 view 上

继续尝试:

确保每个视频流都有独立的渲染逻辑: 将主流和辅流的处理逻辑分开,避免它们在同一个 view 上覆盖

使用不同的事件监听器或参数区分: 可以通过将主流和辅流的视频渲染逻辑完全分离,在不同的监听器中处理它们,确保每个流都使用独立的 view

代码如下:

javascript 复制代码
setRemoteVideoMain(viewMain) {
 this.trtcSdk.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => {
    if (event.streamType === TRTC.TYPE.STREAM_TYPE_MAIN) {
      console.log("开启主流视频源");
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view: viewMain,
      });
    }
  });
}
setRemoteVideoSub(viewSub) {
  this.trtcSdk.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => {
    if (event.streamType === TRTC.TYPE.STREAM_TYPE_SUB) {
      console.log("开启辅流视频源");
      this.trtcSdk.startRemoteVideo({
        userId: event.userId,
        streamType: event.streamType,
        view: viewSub,
      });
    }
  });
}


// 组件中调用
this.setRemoteVideoSub(this.el_scan),
this.setRemoteVideoMain(this.el_other),

完美解决问题,主流和辅流视频源渲染在指定的位置

相关推荐
泯泷4 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm4 小时前
34 合并K个升序链表
javascript·算法·链表
幸运小圣7 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
志尊宝9 小时前
Vue3 零基础每日笔记(038):亲手封装 useDebounceFn 与 useThrottleFn——高频事件的流量阀
前端·javascript·vue·html·vue3
Seoyoneh9 小时前
呼叫中心工单系统架构实战:自动建单与闭环流转技术解析
人工智能·信息与通信·通信
纽格立科技10 小时前
声音广播:要么数字化,要么边缘化
车载系统·音视频·信息与通信·传媒
默_笙11 小时前
🚅 地铁的"回头路、存档点与人工闸机"(下):LangGraph 的循环、持久化与中断
前端·javascript
flash俊杰11 小时前
Zod Schema 驱动的 IPC 契约:从入参校验到状态机一致性的三层防御
javascript·typescript
一条溺水的鱼13 小时前
一次讲透 JS 原型链 —— prototype、__proto__ 和 constructor 到底啥关系
javascript
三乐22813 小时前
一文搞懂 JS 事件流:捕获、冒泡、事件委托
javascript·html