当前位置:   article > 正文

Vue 接入腾讯云【实时音视频】TRTC_trtc.createstream({ audio: true

trtc.createstream({ audio: true

 

需求

(Web端和小程序端进行视频通话)

1. web 端 开启一个房间,房间号假设为 888。此时,画面可以看到自己端的画面。

2. 小程序 端,输入相同的房间号 888,进入房间,即可和 web 端进行视频通话。

准备工作

1. 打开腾讯云官方文档     腾讯云-实时音视频

2. web 端 参照 webDemo 将项目下载下来。小程序参照 小程序端 将项目下载下来。

集成

1. 项目根目录打开命令行,执行

npm install trtc-js-sdk 

2. 局部引入组件(哪个组件使用在哪个组件里引入),不建议在main.js里全局引入。

import TRTC from 'trtc-js-sdk'

3. 打开【准备工作 - 2】下载好的demo打开,寻找关键代码

  • 创建一个实时音视频通话的客户端对象,在每次会话中仅需要调用一次。(js -> rtc-client.js)
  • 因为创建 连接 是需要 skdAppid 和 userSig 的,所以继续往下看。
    1. // create a client for RtcClient
    2. this.client_ = TRTC.createClient({
    3. mode: 'rtc', // 实时通话模式
    4. sdkAppId: this.sdkAppId_,
    5. userId: this.userId_,
    6. userSig: this.userSig_
    7. });
  •  上边的 sdkAppIduserSig 来自哪儿呢,我们按顺序可以找到
  • 我们可以看到 它来自【presetting】的【genTestUserSig】方法、那么获取签名的【genTestUserSig】方法哪里来的呢?在这儿
  • 准备工作做好了,接下来正式开始吧~

Vue文件用法

直接上代码了

  1. <template>
  2. <div class="video_wrap">
  3. <div class="content">
  4. <!-- 远端视频 -->
  5. <div
  6. v-for="(item, index) in remoteStreamList"
  7. :key="index"
  8. class="remote-stream"
  9. >
  10. <div
  11. v-html="item.view"
  12. :class="{ 'distant-stream': item.view }"
  13. >
  14. </div>
  15. </div>
  16. <!-- 本地视频 -->
  17. <div
  18. id='local_stream'
  19. class="local-stream"
  20. >
  21. </div>
  22. </div>
  23. </div>
  24. </template>
  1. <script>
  2. import * as LibGenerateTestUserSig from 'static/lib-generate-test-usersig.min.js'
  3. import TRTC from 'trtc-js-sdk'
  4. export default {
  5. data () {
  6. return {
  7. SDKAPPIDConfig: '腾讯云自己申请的SDKAPPID',
  8. SECRETKEYConfig: '腾讯云自己申请的SECRETKEY',
  9. userId: '',
  10. roomId: null,
  11. client: '', // 客户端服务
  12. remoteStream: '', // 远方播放流
  13. localStream: '', // 本地流
  14. remoteStreamList: [] // 远端小视频
  15. }
  16. },
  17. methods: {
  18. // 可以绑定在按钮上,点击按钮,进行视频通话
  19. createClient (roomId) {
  20. this.userId = 'web_' + parseInt(Math.random() * 100000000)
  21. this.roomId = roomId || '888'
  22. this.localStream = ''
  23. this.remoteStreamList = []
  24. // 获取签名
  25. const config = this.genTestUserSig(this.userId)
  26. const sdkAppId = config.sdkAppId
  27. const userSig = config.userSig
  28. const userId = this.userId
  29. this.client = TRTC.createClient({
  30. mode: 'rtc', // 实时音视频通话
  31. sdkAppId,
  32. userId,
  33. userSig
  34. })
  35. // 注册远程监听
  36. this.subscribeStream(this.client)
  37. // 注册监听事件 如,房间关闭
  38. this.handleEvents(this.client)
  39. // 初始化成功后才能加入房间
  40. this.joinRoom(this.client, this.roomId)
  41. },
  42. // 订阅远端流--加入房间之前
  43. subscribeStream (client) {
  44. client.on('stream-added', event => {
  45. const remoteStream = event.stream
  46. console.log('远端流增加: ' + remoteStream.getId())
  47. // 订阅远端流
  48. client.subscribe(remoteStream)
  49. })
  50. },
  51. handleEvents (client) {
  52. client.on('stream-subscribed', event => {
  53. const remoteStream = event.stream
  54. console.log('远端流订阅成功:' + remoteStream.getId())
  55. // 创建远端流标签,因为id是动态的,所以动态创建,用了v-html
  56. let remoteStreamItem = `<view id="${'remote_stream-' + remoteStream.getId()}" ></view>`
  57. let isExist = this.remoteStreamList.find(item => item.userId === remoteStream.getUserId())
  58. if (!isExist) {
  59. this.remoteStreamList.push({
  60. id: remoteStream.getId(),
  61. userId: remoteStream.getUserId(),
  62. view: remoteStreamItem,
  63. hasVideo: true, // 是否开启了摄像头
  64. hasMic: true // 是否开启了麦克风
  65. })
  66. // 做了dom操作 需要使用$nextTick(),否则找不到创建的标签无法进行播放
  67. this.$nextTick(() => {
  68. //播放远端流
  69. remoteStream.play('remote_stream-' + remoteStream.getId())
  70. })
  71. }
  72. })
  73. },
  74. // 加入房间
  75. joinRoom (client, roomId) {
  76. client.join({ roomId })
  77. .catch(error => {
  78. console.error('进房失败 ' + error)
  79. })
  80. .then(() => {
  81. console.log('进房成功')
  82. // 创建本地流
  83. this.createStream(this.userId)
  84. })
  85. },
  86. // 创建本地音频流
  87. async createStream (userId) {
  88. const localStream = TRTC.createStream({ userId, audio: true, video: true })
  89. // 设置视频属性 Profile 为 '480p'
  90. localStream.setVideoProfile('480p')
  91. this.localStream = localStream
  92. try {
  93. await localStream
  94. .initialize()
  95. // .catch(error => {
  96. // console.error('初始化本地流失败 ' + error)
  97. // })
  98. .then(() => {
  99. console.log('初始化本地流成功')
  100. // 创建好后才能播放 本地流播放 local_stream 是div的id
  101. localStream.play('local_stream')
  102. // 创建好后才能发布
  103. this.publishStream(localStream, this.client)
  104. })
  105. } catch (error) {
  106. switch (error.name) {
  107. case 'NotReadableError':
  108. alert(
  109. '暂时无法访问摄像头/麦克风,请确保系统允许当前浏览器访问摄像头/麦克风,并且没有其他应用占用摄像头/麦克风'
  110. )
  111. break
  112. case 'NotAllowedError':
  113. if (error.message === 'Permission denied by system') {
  114. alert('请确保系统允许当前浏览器访问摄像头/麦克风')
  115. } else {
  116. console.log('User refused to share the screen')
  117. alert('请确保系统允许当前浏览器访问摄像头/麦克风')
  118. }
  119. break
  120. case 'NotFoundError':
  121. alert(
  122. '浏览器获取不到摄像头/麦克风设备,请检查设备连接并且确保系统允许当前浏览器访问摄像头/麦克风'
  123. )
  124. break
  125. default:
  126. break
  127. }
  128. }
  129. },
  130. // 发布本地音视频流
  131. publishStream (localStream, client) {
  132. client
  133. .publish(localStream)
  134. .catch(error => {
  135. console.error('本地流发布失败 ' + error)
  136. })
  137. .then(() => {
  138. console.log('本地流发布成功')
  139. })
  140. },
  141. // 退出房间
  142. logoutHandler () {
  143. this.leaveRoom(this.client)
  144. },
  145. leaveRoom (client) {
  146. client
  147. .leave()
  148. .then(() => {
  149. console.log('退房成功')
  150. // 停止本地流,关闭本地流内部的音视频播放器
  151. this.localStream.stop()
  152. // 关闭本地流,释放摄像头和麦克风访问权限
  153. this.localStream.close()
  154. this.localStream = null
  155. this.client = null
  156. // 退房成功,可再次调用client.join重新进房开启新的通话。
  157. })
  158. .catch(error => {
  159. console.error('退房失败 ' + error)
  160. // 错误不可恢复,需要刷新页面。
  161. })
  162. },
  163. // 获取用户签名 - 前端测试使用
  164. genTestUserSig (userID) {
  165. /**
  166. * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
  167. *
  168. * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,
  169. * 它是腾讯云用于区分客户的唯一标识。
  170. */
  171. const SDKAPPID = this.SDKAPPIDConfig
  172. /**
  173. * 签名过期时间,建议不要设置的过短
  174. * <p>
  175. * 时间单位:秒
  176. * 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
  177. */
  178. const EXPIRETIME = 604800
  179. /**
  180. * 计算签名用的加密密钥,获取步骤如下:
  181. *
  182. * step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
  183. * step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
  184. * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
  185. *
  186. * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
  187. * 文档:https://cloud.tencent.com/document/product/647/17275#Server
  188. */
  189. const SECRETKEY = this.SECRETKEYConfig
  190. if (SDKAPPID === '' || SECRETKEY === '') {
  191. alert(
  192. '请先配置好您的账号信息: SDKAPPID 及 SECRETKEY ' +
  193. '\r\n\r\nPlease configure your SDKAPPID/SECRETKEY in js/debug/GenerateTestUserSig.js'
  194. )
  195. }
  196. const generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME)
  197. const userSig = generator.genTestUserSig(userID)
  198. return {
  199. sdkAppId: SDKAPPID,
  200. userSig: userSig
  201. }
  202. }
  203. }
  204. }
  205. <script>
  1. <style scoped>
  2. .local-stream {
  3. width: 500px;
  4. height: 500px;
  5. }
  6. .remote-stream {
  7. width: 200px;
  8. height: 200px;
  9. }
  10. </style>

 以上就实现了简单的 web 端,在 小程序端输入相同的房间号就可以连接上。

效果图:

注意:

  1. 可在本地 localhost 下访问。
  2. 不可不可不可在 http 下访问,需升级为 https

线上必须使用 https,,,https~~~!!!。

问题:

UserId 使用的中文 

Q:web端和小程序端输入相同的房间号进行视频通话,如果小程序的用户名格式是 【中文+数字】,则两端互相看不到。小程序端的用户名格式改为【英文+数字】就好了??

A:UserId 最好不要用中文,不同平台会有编码的问题。

结语:

以上只是实现了简单的通话效果,更多的细节请参考官网。实时音视频

如果大家需要一些更详细的效果,如:web端 点击某一个视频将其放大这种,可私信我。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/538970
推荐阅读
相关标签
  

闽ICP备14008679号