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

news2024/11/15 10:20:08

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

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

// 播放远端视频 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参数来区分主流视频源和辅流视频源,确保它们渲染到正确的视图上

代码如下:

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

代码如下:

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),

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧工地可视化整体解决方案(Word完整版)

第 一 章 系统总体设计 1.1 总体架构 1.1.1 系统拓扑 1.1.2 系统组成 1.2 设计概述 1.3 平台系统功能 1.3.1 总部数据看板 1.3.2 项目部数据看板 1.3.3 视频联网系统 1.3.4 实名制考勤系统 1.3.5 安全生产系统 1.3.6 塔吊安全监控子系统 1.3.7 施工升降机安全监控管系统 1.3.8 …

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…

Java程序天生就是多线程程序Java程序天生就是多线程程序吗?

一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程。而一个Java程序的运行就算是没有用户自己开启的线程&…

AIGC提示词(2):塑造未来内容创作的核心力量

引言 🌟 在这个数字化的时代,人工智能生成内容(AIGC)正变得越来越普遍。从自动写作到图像生成,AI正以前所未有的速度和多样性创造内容。然而,要实现高质量和相关性强的内容生成,关键在于有效地…

Python变量类型

参考: Python 变量类型 | 菜鸟教程 (runoob.com) 变量赋值 Python 中的变量赋值不需要类型声明(重点注意这一点)。 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。 每个变量在使用前都必须赋值&#xff…

golang zap日志模块封装sentry

我们自己写个log日志包,把zap和sentry封装到一起。 下面直接贴上主要部分代码(两个模块初始化部分的代码请自行查阅官方文档): logger.go package logimport ("github.com/getsentry/sentry-go""go.uber.org/zap…

使用Redis如何实现集群会话同步?

使用Redis如何实现集群会话同步? 1、为什么选择Redis?2、如何实现?1. 环境准备2. 配置Web服务器3. 测试与验证4. 监控与优化 💖The Begin💖点点关注,收藏不迷路💖 在分布式Web应用中&#xff0c…

探索全能型AI与专业型AI的未来趋势

目录 前言1. 全能型AI与专业型AI的对比1.1 经济市场与用户吸引力1.2 精度与效果 2. AI模型的全面评估与比较2.1 精度2.2 速度2.3 鲁棒性 3. 专精化与可扩展性的权衡3.1 专精化的优势与挑战3.2 全能型AI的可扩展性 结语 前言 在人工智能领域,随着技术的迅猛发展&…

解决:pip install flash-attn安装失败案例【cuda】【torch】【flash-attn】

问题描述 在一个容器中部署项目环境中,遇到的flash-attn库总是安装失败,报错信息大致是:FileNotFoundError: [Errno 2] No such file or directory: :/usr/local/cuda/bin/nvcc,以及后来可能会提示’torch’未安装,却…

Android中服务(service)的基本用法

文章目录 Android中服务(service)的基本用法服务是什么定义一个服务启动和停止服务 Android中服务(service)的基本用法 服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非…

智能停车场管理小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,车位信息管理,车位预订管理,系统管理 微信端账号功能包括:系统首页,地图,我的 开发系统:Windows 架构模式…

Golang | Leetcode Golang题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; func lexicalOrder(n int) []int {ans : make([]int, n)num : 1for i : range ans {ans[i] numif num*10 < n {num * 10} else {for num%10 9 || num1 > n {num / 10}num}}return ans }

如何处理时间序列异常值?理解、检测和替换时间序列中的异常值

异常值的类型 (欢迎来到雲闪世界) 异常值是与正常行为有显著偏差的观察结果。 时间序列可能会因某些异常和非重复事件而出现异常值。这些异常值会影响时间序列分析&#xff0c;并误导从业者得出错误的结论或有缺陷的预测。因此&#xff0c;识别和处理异常值是确保时间序列建模…

域名是什么

在这个数字世界中&#xff0c;域名无疑是连接用户与网站的关键纽带。域名&#xff0c;是由一串字符组成的地址&#xff0c;用于在互联网上唯一标识和定位一个特定的资源。本文将深入探讨域名的概念、作用以及对互联网发展的重要性。 一、域名的定义与结构 域名可以看作是互联网…

用矩阵乘法的底层原理来理解“特征融合”

大家好啊&#xff0c;我是董董灿。 在很多 AI 模型中&#xff0c;都会出现内积运算。无论是卷积/全连接还是 Transformer 架构中的矩阵乘法&#xff08;或线性映射&#xff09;&#xff0c;其核心运算逻辑都是内积运算。 因此&#xff0c;很多时候&#xff0c;我们也把内积运…

Java 输入与输出之 NIO.2【AIO】【内存映射文件】【自动资源管理】探索之【四】

一&#xff0c;自动资源管理 Java 7 增加了一个新特性&#xff0c;该特性提供了另外一种管理资源的方式&#xff0c;这种方式能自动关闭文件等系统资源。这个特性又被称为自动资源管理(Automatic Resource Management, ARM)&#xff0c; 该特性以 try 语句的扩展版为基础。自动…

泛微E9开发 申请流程时,通过附件ID带出文件

申请流程时&#xff0c;通过附件ID带出文件 1、需求说明2、实现操作3、标准API知识-修改单个字段值&#xff08;不支持附件类型&#xff09;3.1.格式3.2.参数说明3.3.样例3.4.特别注意 1、需求说明 在用户申请流程表单的时候&#xff0c;需要用到系统中已经存在的文档&#xf…

MySQL-进阶篇-锁(全局锁、表级锁、行级锁)

文章目录 1. 锁概述2. 全局锁2.1 介绍2.2 数据备份2.3 使用全局锁造成的问题 3. 表级锁3.1 表锁3.1.1 语法3.1.2 读锁3.1.3 写锁3.1.4 读锁和写锁的区别 3.2 元数据锁&#xff08;Meta Data Lock&#xff0c;MDL&#xff09;3.3 意向锁3.3.1 案例引入3.3.2 意向锁的分类 4. 行级…

【超详细】从 0 到 1 打包你的 uni-app 应用:安卓篇打包指南

一. 介绍 在当前移动应用开发的大环境下&#xff0c;uni-app 作为一种使用 Vue.js 开发多平台应用的框架&#xff0c;为开发者提供了快速构建跨平台应用的能力。本文将为你介绍如何将 uni-app 项目打包成安卓应用&#xff0c;让你的应用在安卓设备上运行并上架应用市场。 二.…

学习之MySQL函数(字符串,数值,日期,流程)

字符串函数 函数是指一段可以直接被另一段程序或代码 案例&#xff1a; – 1、由于业务需求变更&#xff0c;企业员工的工号&#xff0c;统一为5位数&#xff0c;目前不足5位数的全部在前面补0、比如:1号员工的工号应该为00001. update emp set worknolpad(workno, 5, 0) 运…