移动端Web接入腾讯云TRTC实践(React+TS)

这篇具有很好参考价值的文章主要介绍了移动端Web接入腾讯云TRTC实践(React+TS)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实时音视频服务在项目中出现的频率越来越高的,自己写webRTC的成本相对腾讯云的TRTC-SDK要多大得多,最近公司项目移动端和PC端Web(React+TS)小程序(Taro)中都有使用到,这里针对移动端web做实时通话做个记录与大家交流下

TRTC流程图

移动端Web接入腾讯云TRTC实践(React+TS)

相信准备接入或者已经在接入TRTC的小伙伴是看过文档实时音视频,这里不说这些概念了,直接上代码

一、安装TRTC依赖

pnpm i trtc-js-sdk @types/trtc-js-sdk -D

二、初始化TRTC实例

import TRTC from 'trtc-js-sdk'
// 创建TRTC实例
trtcInstance.current = TRTC.createClient({ 
    sdkAppId, // 腾讯云申请的appId
    userSig, // 用户签名,后端获取
    userId, // 随机生成的用户ID,不可重复
    mode: 'rtc' // 实时音视频通话模式
})
// 创建本地流Stream
localStreamRef.current = TRTC.createStream({ userId, audio: true, video: false })
// 绑定TRTC事件
bindTRTCEvent()

三、绑定TRTC事件

// TRTCEvent 可自行从trtc-js-sdk中获取到

trtcInstance.current?.on(TRTCEvent.NETWORK_QUALITY, (event) => {
  subscribeTrtcNetwork?.(event)
  // 监听网络变化 
  if (event.uplinkNetworkQuality > 3 || uplinkLoss > 3) {
     // 本地用户网络差,uplinkLoss(丢包率) 的值可自行调试
  } else if (network.downlinkNetworkQuality > 3 || network.downlinkLoss > 3) {
     // 远端用户网络差,downlinkLoss(丢包率) 的值可自行调试
  }
})
// 添加远程流
trtcInstance.current?.on(TRTCEvent.STREAM_ADDED, (event) => {
  const remoteStream = event.stream
  trtcInstance.current?.subscribe(remoteStream)
    .then(() => {
       // 远端用户进入房间
    })
    .catch((error) => {
      // 远端进入房间失败
    })
})
// 订阅远程流
trtcInstance.current?.on(TRTCEvent.STREAM_SUBSCRIBED, (event) => {
  const remoteStream = event.stream
  remoteStream.on('error', (error) => {
    // 远端流异常
  })
  // 创建播放容器
  const remotePlayerElement = document.createElement('div')
  remotePlayerElement.id = 'remote-stream-' + remoteStream.getId()
  document.body.appendChild(remotePlayerElement)
  remoteStream.play(remotePlayerElement.id)
})
// 有用户被赶出事件
trtcInstance.current?.on(TRTCEvent.CLIENT_BANNED, (error) => {
    // 远端用户异常推出房间
})
// 远端用户推流断开
trtcInstance.current?.on(TRTCEvent.STREAM_REMOVED, (event) => {
  // 远端用户推流断开
  const remoteStream = event.stream
  remoteStream.stop()
  remoteStream.close() // 离开房间释放资源
})
// 远端用户离开房间
trtcInstance.current?.on(TRTCEvent.PEER_LEAVE, (event) => {
  // 远端用户离开房间
})

四、进入房间

await trtcInstance.current?.join({ roomId })
// 初始化本地音视频流
await localStream.current?.initialize?.()
// 本地需创建一个localStream的dom
localStream.current?.play?.('localStream')
if (localStream?.current) {
    await trtcInstance.current?.publish?.(localStream.current)
}

五、退出房间

if (trtcInstance.current &&  localStream.current) {
  await trtcInstance.current?.unpublish?.(localStreamRef?.current)
  await trtcInstance.current?.leave()
  localStreamRef.current?.stop()
  localStreamRef.current?.close()
}

六、完整demo (hooks,无UI)

import { useRef } from 'react'
import TRTC, { Client, LocalStream } from 'trtc-js-sdk'

const useTRTC = () => {
  const trtcInstance = useRef<Client | null>(null)
  const localStream = useRef<LocalStream | null>(null)
  
  const init = () => {
      try {
        // 创建TRTC实例
        trtcInstance.current = TRTC.createClient({ 
            sdkAppId, // 腾讯云申请的appId
            userSig, // 用户签名,后端获取
            userId, // 随机生成的用户ID,不可重复
            mode: 'rtc' // 实时音视频通话模式
        })
        // 创建本地流Stream
        localStream.current = TRTC.createStream({ userId, audio: true, video: false })
        // 绑定TRTC事件
        bindTRTCEvent()
      } catch(error) {
        console.log('初始化TRTC失败', error)
      } 
  }
  
  const enterRoom = async () => {
    try {
         await trtcInstance.current?.join({ roomId })
        // 初始化本地音视频流
        await localStream.current?.initialize?.()
        // 本地需创建一个localStream的dom
        localStream.current?.play?.('localStream')
        if (localStream?.current) {
            await trtcInstance.current?.publish?.(localStream.current)
        }
    } catch (error) {
        console.log('进入房间失败', error)
    }
  }
  
  const exitRoom = async () => {
    if (trtcInstance.current &&  localStream.current) {
      await trtcInstance.current?.unpublish?.(localStream?.current)
      await trtcInstance.current?.leave()
      localStream.current?.stop()
      localStream.current?.close()
    }
  }
  
  const bindTRTCEvent = () => {
    trtcInstance.current?.on(TRTCEvent.NETWORK_QUALITY, (event) => {
      subscribeTrtcNetwork?.(event)
      // 监听网络变化 
      if (event.uplinkNetworkQuality > 3 || uplinkLoss > 3) {
         // 本地用户网络差,uplinkLoss(丢包率) 的值可自行调试
      } else if (network.downlinkNetworkQuality > 3 || network.downlinkLoss > 3) {
         // 远端用户网络差,downlinkLoss(丢包率) 的值可自行调试
      }
    })
// 添加远程流
    trtcInstance.current?.on(TRTCEvent.STREAM_ADDED, (event) => {
        const remoteStream = event.stream
        trtcInstance.current?.subscribe(remoteStream)
          .then(() => {
             // 远端用户进入房间
          })
          .catch((error) => {
            // 远端进入房间失败
          })
    })
    // 订阅远程流
    trtcInstance.current?.on(TRTCEvent.STREAM_SUBSCRIBED, (event) => {
        const remoteStream = event.stream
        remoteStream.on('error', (error) => {
          // 远端流异常
        })
        // 创建播放容器
        const remotePlayerElement = document.createElement('div')
        remotePlayerElement.id = 'remote-stream-' + remoteStream.getId()
        document.body.appendChild(remotePlayerElement)
        remoteStream.play(remotePlayerElement.id)
    })
    // 有用户被赶出事件
    trtcInstance.current?.on(TRTCEvent.CLIENT_BANNED, (error) => {
        // 远端用户异常推出房间
    })
    // 远端用户推流断开
    trtcInstance.current?.on(TRTCEvent.STREAM_REMOVED, (event) => {
        // 远端用户推流断开
        const remoteStream = event.stream
        remoteStream.stop()
        remoteStream.close() // 离开房间释放资源
    })
    // 远端用户离开房间
    trtcInstance.current?.on(TRTCEvent.PEER_LEAVE, (event) => {
        // 远端用户离开房间
    })
  }
  return {
      init,
      enterRoom,
      exitRoom,
      ....
  }
}

以上是TRTC的流程,除了这些,我们还有其他的重要流程,如:

  • 授权麦克风、摄像头权限(这里只针对麦克风)
  • 关闭麦克风
  • 通话期间保持常亮
  • 当前标签页是否进入后台
  • …(其他的还有的可交流)

注意:由于浏览器的安全策略,音视频自动播放必须用户与页面产生交互,否则无法自动播放;

移动端目前无法实现听筒和扬声器的切换(如果有小伙伴有实现方案,可以交流下)

其他更多的业务层的逻辑了,如有疑惑的,欢迎探讨,如果对你有帮助的,请手动点赞,谢谢!文章来源地址https://www.toymoban.com/news/detail-403487.html

到了这里,关于移动端Web接入腾讯云TRTC实践(React+TS)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【新知实验室 TRTC&IM】实时互动课堂最佳实践

    活动链接:https://marketing.csdn.net/p/637c852aedd21c0ef20754a7d7635e6d 活动链接:https://marketing.csdn.net/p/637c852aedd21c0ef20754a7d7635e6d 活动链接:https://marketing.csdn.net/p/637c852aedd21c0ef20754a7d7635e6d 在线上线下一体化、虚拟现实加速融合的趋势下,音视频已经演进成一种基本能力,深刻变革了社会的交

    2024年01月16日
    浏览(50)
  • Unity接入GVoice腾讯实时语音

    最近在做一个实时竞技类游戏,类似于王者荣耀类型的MOBA类实时联网游戏。针对战斗和组队界面需要加入语音的方便大家进行交流,看了几家语音价格也都是参差不齐最后选择的是腾讯的GVoice(价格很低折合费用下来一人一天0.012元),这个也是我们目前用的最合适的。后面

    2024年02月20日
    浏览(32)
  • 最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)

    最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)。 什么是推流? 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源端可以是摄像头、采集卡等设备,而目标端

    2024年02月04日
    浏览(67)
  • java腾讯云人脸核身移动浮层H5接入

    腾讯云人脸核身文档 最近公司有业务需求,需要对企业微信中的小程序添加人脸识别功能,一般的人脸核身是对app中添加sdk完成的,考虑到业务需要,采用腾讯云的移动浮层H5接入,废话不多说,直接上代码。 这边,这3步已经满足了我们的需要。 nonce是自定义的随机字符串

    2024年02月14日
    浏览(43)
  • 腾讯TIM实现即时通信 v3+ts实践

    目录 初始化sdk 功能描述 初始化 准备 SDKAppID 调用初始化接口  监听事件 发送消息 创建消息 创建文本消息 登录登出 功能描述 登录 登出 销毁 登录设置 获取会话列表 功能描述 获取会话列表 获取全量的会话列表  历史消息 功能描述 拉取消息列表 分页拉取指定会话的消息列

    2024年02月04日
    浏览(54)
  • 【新知实验室】腾讯云TRTC初体验

    今年腾讯云音视频发布了“三合一”的RT-ONE™网络。该网络整合了腾讯云实时通信网络(TRTC)、即时通信网络(IM)以及流媒体分发网络(CDN)三张网络,为业界最完整的音视频通信PaaS平台构建基座,面向教育、零售、泛娱乐等行业需求提供服务。 接下来我主要为大家展示

    2023年04月08日
    浏览(55)
  • web接入大华摄像头实时视频

    目录 一、FFmpeg下载及配置​​​​ 二、nginx下载及配置 三、摄像rtsp取流 四、ffmpeg推流 五、html前端工作 地址:Download FFmpeg    下载并解压FFmpeg文件夹,配置环境变量:在“Path”变量原有变量值内容上加上d:ffmpegbin,验证:ffmpeg -version 出现版本号则成功。 这个我之前有,

    2023年04月20日
    浏览(69)
  • 海康实时监控预览视频流接入web

            我们采取的方案是后端获取视频流返回给前端,然后前端播放 根据官方文档传输对应的参数  官方接口限制:为保证数据的安全性,取流URL设有有效时间,有效时间为5分钟。 注意不同协议的限制不同,rtsp没得限制但前端播放麻烦,web端展示的话ws比较好 海康开放平

    2024年04月17日
    浏览(48)
  • 【实战】 TS 应用:JS神助攻 - 强类型 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(三)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月09日
    浏览(48)
  • 【实战】三、TS 应用:JS神助攻 - 强类型 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(三)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月11日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包