当前位置:   article > 正文

VUE接入腾讯实时音视频TRTC方法_vue 接入腾讯视频通话

vue 接入腾讯视频通话

VUE接入腾讯实时音视频TRTC方法

由于公司很多项目中都涉及到了音视频实时通话,在刚开始项目工期比较紧就直接给腾讯的Demo下载下来,在项目中iframe引入使用了。最近领导说让给改成vue的,方便以后好维护。于是结合官网和demo代码终于完成了改造。下边梳理出来一些供大家参考。

官方文档:https://cloud.tencent.com/document/product/647/17249

1.首先集成TRTC,在项目中运行如下命令下载依赖,在所需组件中引入;

  1. npm install trtc-js-sdk
  2. //在所需组件中引入
  3. import TRTC from 'trtc-js-sdk'

2.视频容器

  1. //主视频窗口
  2. <div  id="local_stream" class="local-stream"  style="width:100%;height:100%"> </div>
  3. //小视频(这块考虑的是多人视频)
  4. <div v-for="(item,i) in remoteStream" :key="i" class="video-box" >
  5.     <div :class="item?'distant-stream':''"  v-html="item"  ></div>
  6. </div>

3.核心音视频链接方法

  1. export default {
  2.    data() {
  3.      userId: '', //用户id --可更改
  4.      roomId: '', //房间号--加入相同房间才能聊
  5.      client: '', //客户端服务
  6.      remoteStream: [], //远方视频流
  7.      localStream: null, //本地流
  8.      sdkAppId: '', //sdkID
  9.      userSig: '', //签名
  10.      localStream:null,//本地视频流
  11.   },
  12.    mounted(){
  13.        //下方参数是链接的必要参数。需要根据自己情况的情况获取!!!。
  14.         this.sdkAppId = sessionStorage.getItem('sdkAppId')
  15.         this.userSig = sessionStorage.getItem('userSig')
  16.         this.userId = sessionStorage.getItem('userId')
  17.         this.roomId = this.$route.query.roomId * 1 //必须是number
  18.         this.createClient(this.userId)
  19.   },
  20.    methods: {
  21.        //创建链接
  22.        createClient(userId) {
  23.          const sdkAppId = this.sdkAppId
  24.          const userSig = this.userSig
  25.          this.client = TRTC.createClient({
  26.            mode: 'rtc',
  27.            sdkAppId,
  28.            userId,
  29.            userSig
  30.         })
  31.          //注册远程监听,要放在加入房间前--这里用了发布订阅模式
  32.          this.subscribeStream(this.client)
  33.          //初始化后才能加入房间
  34.          this.joinRoom(this.client, this.roomId)
  35.          // 公共监听方法----主要是推流方摄像头关闭,音频关闭开启等;下方有说!!
  36.          // this.publicMonitor(this.client)
  37.       },
  38.        //加入房间
  39.        joinRoom(client, roomId) {
  40.          client.join({ roomId })
  41.           .catch(error => {
  42.              console.error('进房失败 ' + error)
  43.           })
  44.           .then(() => {
  45.              console.log('进房成功')
  46.              //创建本地流
  47.              this.createStream(this.userId)
  48.              //播放远端流
  49.              this.playStream(this.client)
  50.           })
  51.       },
  52.        //创建本地音视频流
  53.         createStream(userId) {
  54.          const localStream = TRTC.createStream({ userId, audio: true, video: true })
  55.          this.localStream = localStream
  56.          localStream
  57.           .initialize()
  58.           .catch(error => {
  59.              console.error('初始化本地流失败 ' + error)
  60.           })
  61.           .then(() => {
  62.              console.log('初始化本地流成功')
  63.              localStream.play('local_stream')
  64.              //创建好后才能发布
  65.              this.publishStream(localStream, this.client)
  66.           })
  67.       },
  68.           //发布本地音视频流
  69.        publishStream(localStream, client) {
  70.          client
  71.           .publish(localStream)
  72.           .catch(error => {
  73.              console.error('本地流发布失败 ' + error)
  74.           })
  75.           .then(() => {
  76.              console.log('本地流发布成功')
  77.           })
  78.       },
  79.        //订阅远端流--加入房间之前
  80.        subscribeStream(client) {
  81.          client.on('stream-added', event => {
  82.            const remoteStream = event.stream
  83.            //订阅远端流
  84.            client.subscribe(remoteStream)
  85.         })
  86.       },
  87.        //播放远端流
  88.        playStream(client) {
  89.          client.on('stream-subscribed', event => {
  90.            const remoteStream = event.stream
  91.            console.log('远端流订阅成功:' + remoteStream.getId())
  92.            // 创建远端流标签,因为id是动态的,所以动态创建,用了v-html
  93.            const base = `<view id="${'remote_stream-' + remoteStream.getId()}" style="width:100%;height:100%"></view>`
  94.            this.remoteStream.push(base)
  95.            //做了dom操作 需要使用$nextTick(),否则找不到创建的标签无法进行播放
  96.            this.$nextTick(() => {
  97.              //播放
  98.              remoteStream.play('remote_stream-' + remoteStream.getId())
  99.           })
  100.         })
  101.       },
  102.       //退出音视频
  103.       leaveRoom() {
  104.           var client = this.client
  105.              client.leave().then(() => {
  106.                // 停止本地流,关闭本地流内部的音视频播放器
  107.                this.localStream.stop()
  108.                // 关闭本地流,释放摄像头和麦克风访问权限
  109.                this.localStream.close()
  110.                this.localStream = null
  111.                this.client = null
  112.                // 退房成功,可再次调用client.join重新进房开启新的通话。
  113.             })
  114.               .catch(error => {
  115.                  console.error('退房失败 ' + error)
  116.                  // 错误不可恢复,需要刷新页面。
  117.               })
  118.       }
  119.   }
  120. }

4.公共监听方法(新增删减人员,开始关闭音频等)

  1. //主要检测推流方公共方法内
  2. publicMonitor(client) {
  3.      var that = this
  4.      // 新增人员
  5.      client.on('peer-join', evt => {
  6.        console.log(evt)
  7.     })
  8.      // 删减人员
  9.      client.on('peer-leave', evt => {
  10.         console.log(evt)
  11.     })
  12.      // 推流方关闭音频
  13.      client.on('mute-audio', evt => {
  14.         console.log(evt)
  15.     })
  16.      // 推流方开启音频
  17.      client.on('unmute-audio', evt => {
  18.         console.log(evt)
  19.     })
  20. },
  21. //关闭本地摄像头   this.localStream.muteVideo()  
  22. //开始本地摄像头   this.localStream.unmuteVideo()
  23. //关闭本地麦克风 this.localStream.muteAudio()
  24. //开启本地麦克风   this.localStream.unmuteAudio()
  25. //监听声音大小 在本地视频里发布成功后调用。
  26. setVolumeInterval(stream, userId) {
  27.     setInterval(() => {
  28.          const volume = stream.getAudioLevel()
  29.          console.log(volume)
  30.         // volume>0.01 算是正常说话;
  31.         //如需监听房间内所有人声音大小需要在增加人员后调用下;针对每个人设置一个setInterval
  32.         //在关闭麦克风和人员退出需要清除该人员的定时器。房间退出后结束全部定时器;
  33.     })
  34. }

以上就是一些核心的方法。希望对大家有帮助 如有疑问请留言!

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/70122
推荐阅读
相关标签
  

闽ICP备14008679号