【2024】uniapp 接入声网音频RTC【H5+Android】Unibest模板下Vue3+Typescript

news2024/11/26 4:48:01

需求

最近开发一个项目,需要实现声网的接入。由于采用uniapp模式,按照最佳实践采用优先开发H5再适配的模式。因此实现了H5和Android两种模式的接入,Android里采用离线打包自定义基座来进行调试。怕自己忘记了,在这里详细的记录完整的核心整合逻辑

准备

开始前,准备了以下组件:

unibest        菲鸽开源的uniapp模板,对于安卓代码,采用的是中间编译模式。因此APP模式下已经是混淆压缩过的代码了,即使采用uniapp云打包上传代码,也是相对的安全。当然对于咱的开发来说可以更抠门一点,连云打包都不用了,直接离线编译基座🤪(项目没上线,银子有限而已)

JDK        万年不变的1.8版本,主要是因为下来的参考代码也都是jdk1.8编译级别的

AndroidStudio        版本是2024.1.2,SDK下载了30和28的版本(为什么是28?因为目前各大市场都要求最低最少兼容安卓9.0)

HBuilder安卓示例        这个是HBuilder的安卓示例项目。里面包含了AS插件项目以及AS整合项目。你需要以这个为基础项目来参考修改。【福利】百度网盘太慢,这里我自己收录了一份

Agora-RTC_3.7.0_example        AgoraRTC SDK使用的示例项目,由于unibest使用的是Typescript,因此需要这个项目里包含的typescript模式的sdk使用代码

Agora-RTC_3.7.2        AgoraRTC的uniapp插件包,可以从DCloud市场下载,里面包含了安卓插件编译aar文件

接入步骤

H5接入

H5接入的前提假设你使用unibest模板建立了一个基础项目。

1.添加npm组件

首先是给项目添加npm组件

pnpm i agora-rtc-sdk-ng

2.导入组件

在页面的script头部申明导入

import AgoraRTC, { IAgoraRTCClient } from 'agora-rtc-sdk-ng'

3.定义控制对象

对于H5,我们只需要两个组件变量即可,一个是RTC客户端,一个是用于控制本地音频采集的本地音轨

let client: IAgoraRTCClient, localAudioTrack

4.初始化引擎

client = AgoraRTC.createClient({ mode: 'rtc', codec: 'h264' })

5.订阅音轨

这样可以收听到其它用户声音,注意时间额度用光后,这里是进不来的

      client.on('user-published', async (user, mediaType) => {
        // 声网IP/ID每日免费额度到了后这里进不来(大坑)
        console.log('==== start subscribe audio track ====')
        // 开始订阅远端用户。
        await client.subscribe(user, mediaType)
        console.log('subscribe success')

        // 表示本次订阅的是音频。
        if (mediaType === 'audio') {
          // 订阅完成后,从 `user` 中获取远端音频轨道对象。
          const remoteAudioTrack = user.audioTrack
          // 播放音频因为不会有画面,不需要提供 DOM 元素的信息。
          remoteAudioTrack.play()
        }
      })

6.加入Channel

这里由于我们后端采用的是雪花分片算法,属于64位长整型,因此不能直接采用number传入,这里有坑。API备注写的很清楚,如果要长整型的用户ID,请使用string传入

生成token其它文章官网或其它的文章很多,我就不啰嗦了,包括生成临时token或者channel专用token。不懂生成token的先搜索下其他文章。appId是你在声网建立的应用ID。

      const uid = await client.join(
        groupVoiceConf.appId,
        groupId.toString(),
        groupVoiceConf.token,
        currentUserId.toString()
      )

7.发布音频

发布和停止发布音频即上麦和下麦功能。

上麦代码:

  try {
    if (client) {
      localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack()
      await client.publish(localAudioTrack) // 发布音频
    }
  } catch (e) {
    console.log(e)
  }

下麦代码:

  try {
    if (localAudioTrack) {
      await client.unpublish(localAudioTrack)
      localAudioTrack.stop()
      localAudioTrack.close()
    }
  } catch (e) {
    console.log(e)
  }

8.离开频道

离开频道后不会收听以及发言,代码如下:

  if (client) await client.leave()

9.HTML引擎不支持怎么办

对于某些精简的浏览器以及小米浏览器,存在无法兼容AgoraRTC代码的情况。是否可以根据支持情况提前判断呢?其实AgoraRTC提供了检测API checkSystemRequirements,只需要先检测,然后再执行RTC的代码即可,格式看上去这样的:

  const result = AgoraRTC.checkSystemRequirements()
  if (result) {
    try {
    // your RTC code
    } catch (e) {
      console.log(e)
    }
  } else {
    utils.alert('您的浏览器不支持交互语音')
  }

注意RTC引擎都是Promise结构,因此都需要await调用和try...catch接口来判断调用失败

另外请在https环境下执行代码(搜一下plugin-basic-ssl把这个接入到vite去),直接在http环境下功能是受限制的。

另外按照官方的要求,自己生成token后,是需要定时刷新的,这部分代码页面使用一个定时器刷新即可,具体代码请自己琢磨前后端代码。

安卓接入

由于unibest开发模式推荐VSCode不是基于HBuilder,这里会有取舍:

坏处:不能像直接使用HBuilder那样在Manifest提供多个可视化选项来进行插件云打包。
好处:如果不用打自定义基座,云打包上传的代码都是压缩编译过的,相对来说比较安全。

虽然无法直接使用云打包的插件,但是我们可以使用离线打包,来弥补这个不足。

注意后面如果不特别说明,项目都是指AndroidStudio项目。

1.导入AS

我们解开Android-SDK@4.28.82186_20240923.zip,将里面的HBuilder-Integrate-AS目录释放到一个文件夹,将这个项目导入到AndroidStudio,开始配置。

2.AS配置:证书

按照官网的流程,生成自己的证书,并上传到DCloud后台(这里不是HBuilder,要登录DCloud开发者平台)。详细的自己查,这里只记录几个简要的流程:
生成证书:

set PATH=C:/JDK11/bin
keytool -genkey -alias <aliasName> -keyalg RSA -keysize 2048 -validity 36500 -keystore simpleDemo/<aliasName>.keystore

 aliasName以及密码等根据自己实际情况设置。注意后面上传到DCloud后台要用这些信息的。

查看填写到DCloud后台的几个信息

set PATH=C:/JDK11/bin
keytool -list -v -keystore simpleDemo/<aliasName>.keystore
pause

查看时要输入前面genkey时的密码

然后要把证书的几个信息都配置到simpleDemo/build.gradle的signingConfigs

    signingConfigs {
        config {
            keyAlias '<aliasName>'
            keyPassword '<yourPass>'
            storeFile file('<aliasName>.keystore')
            storePassword '<yourStorePass>'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

建议前面的keypass和storepass设置成一致,免得密码太多了操作蛋疼

这里有坑,注意如果上传DCloud后台时包名发生了变更,也一定要在AndroidManifest.xml里修改包名,不然有签名设置不正确报错

3.AS配置:权限

打开项目的manifests/AndroidManifest.xml,在<manifest xmlns:android>这个节点下加入权限申明(本项目只使用音频):

    <!-- 声音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

4.AS配置:开启调试

修改项目的assets/data/dcloud_control.xml,将根节点修改为以下格式:

<hbuilder debug="true" syncDebug="true">

这个模式表示是打包自定义调试基座,如果要做正式发布时,要把debug和syncDebug去掉

另外按照uniapp整合规范,需要把appid修改为你自己项目的appid值        

5.AS配置:相关的gradle组件包

打开项目根目录下的simpleDemo/build.gradle,在dependencies节点下添加4个组件

    implementation 'io.agora.rtc:agora-special-full:3.7.2.4'
    implementation 'io.agora.rtc:full-screen-sharing:3.7.2.4'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.50'

    //自定义基座需要的
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'

okhttp如果不导入的话,当做自定义基座就会无法将调试信息发送到HBuilder,如果你用adb的话就无所谓。建议始终带上。

另外在Agora-Uniapp-SDK.zip里找到uniplugin_agora_rtc-release.aar,把这个放入项目simpleDemo\libs下。如果要打正式release包,要把这个组件去掉,不用删除,直接写在exclude里好了:

    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: ['debug-server-release.aar'])

然后记得点AS菜单File->Sync Project With Gradle Files

6.AS配置:配置自定义插件

在项目simpleDemo\assets下建立文件dcloud_uniplugins.json,内容如下:

{
  "nativePlugins": [
    {
      "plugins": [
          {
            "type": "module",
            "name": "Agora-RTC-EngineModule",
            "class": "io.agora.rtc.uni.AgoraRtcEngineModule"
          },
          {
            "type": "module",
            "name": "Agora-RTC-ChannelModule",
            "class": "io.agora.rtc.uni.AgoraRtcChannelModule"
          },
          {
            "type": "component",
            "name": "Agora-RTC-SurfaceView",
            "class": "io.agora.rtc.uni.AgoraRtcSurfaceView"
          },
          {
            "type": "component",
            "name": "Agora-RTC-TextureView",
            "class": "io.agora.rtc.uni.AgoraRtcTextureView"
          }
        ]
    }
  ]
}

7.链接你的编译结果

在你的unibest项目下执行命令

pnpm build:app-android --mode production

然后把项目dist\build\app拷贝到项目的simpleDemo/assets/apps/<你项目的UNIAPP_ID>/www下。

如果你嫌每次拷贝麻烦,直接建立一个软链接过去就好(WINDOWS下不会?搜一下mklink怎么用)

最后一步,注意了,我就是在这里没操作正确导致卡了2天。

删除项目下的simpleDemo/build目录,然后
A)出基座,使用Build -> Build App Bundle(s)/APK(s)
B)出release,使用Build -> Generate Singed App Bundle /APK

如果你的操作正确,后面接入代码后HBuilder启动时就不会出现下面报错:

[JS Framework] 当前运行的基座不包含原生插件[Agora-RTC-ChannelModule],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

[JS Framework] 当前运行的基座不包含原生插件[Agora-RTC-EngineModule],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

8.接入TypeScript组件

下一步要接入代码了,但是unibest是Typescript代码,Agora-RTC_3.7.0_example里的就不顶用了。实际上,在官网github里有一份typescript代码,只是没放到发布包里。从github里把整个项目下下来,找到src/components,把整个目录放到unibest项目的src/components下。在VSCode里看上去的文件是这样:

9.引入组件

然后就可以在语音界面开始调用了,script里引入组件

import RtcEngine, { RtcChannel } from '../../components/Agora-RTC-JS/index'
import { ClientRole, ChannelProfile } from '../../components/Agora-RTC-JS/common/Enums'

10.定义rtcEngine

APP这里定义变量简单点,只需要定义好rtcEngine即可

let rtcEngine: RtcEngine

11.初始化引擎

申请录音权限是自己的框架代码,您可以自己封装一下。然后就是收听其它人员,加入频道等。这里就不一一解释了,加入频道支持雪花ID需要使用joinChannelWithUserAccount。代码在下面

  if (uni.getSystemInfoSync().platform === 'android') {
    // 华为市场规范,先申请权限
    await requestPermission('RECORD', '用于听美丽的歌声啊啊啊啊')
  }

  rtcEngine = await RtcEngine.create(groupVoiceConf.appId) // 创建引擎
  await rtcEngine.enableAudio() // 收听其它伙伴的发言
  await rtcEngine.setChannelProfile(ChannelProfile.LiveBroadcasting)
  await rtcEngine.setClientRole(ClientRole.Broadcaster)

  await rtcEngine.joinChannelWithUserAccount(
    groupVoiceConf.token,
    groupId.toString(),
    currentUserId.toString()
  )
  await rtcEngine.enableLocalAudio(false) // 默认进入频道麦克风是开启的,需要关闭

12.上/下麦

代码如下

  await rtcEngine.enableLocalAudio(true) // 上麦
  await rtcEngine.enableLocalAudio(false) // 下麦

12.离开频道

  if (rtcEngine) await rtcEngine.leaveChannel()

IOS接入(略)

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

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

相关文章

深入学习从入门到放弃:掌握梯度概念,开始征服深度学习!

文章目录 从现实中的例子理解什么是梯度梯度的数学定义梯度的严格的数学定义为什么梯度向量指向函数增长最快的方向&#xff1f; 为什么梯度是深度学习优化的最基础概念在python中实现梯度求导的简单案例一元线性回归多元线性回归 结合示例深度学习中的梯度求导的一般过程数学原…

开源AI智能名片链动2+1模式S2B2C商城小程序源码在B2B情境化营销中的应用

摘要&#xff1a;本文探讨情境化营销在B2B环境中的适用性&#xff0c;分析现有的B2B情境化营销案例&#xff0c;如通过物联网传感设备进行设备监控与预防保养。随后引入“开源AI智能名片链动21模式S2B2C商城小程序源码”&#xff0c;阐述其如何助力B2B企业在情境化营销中提升效…

弧形导轨驱动器高效使用技巧!

弧形导轨驱动器是一种用于驱动滑座沿着导轨做弧线运动的设备&#xff0c;其用方法因具体型号和应用场景的不同而有所差异&#xff0c;通常可以归纳为以下几个步骤&#xff1a; 1、安装前要明确弧形导轨的使用需求&#xff0c;根据需求选择合适的弧形导轨驱动器&#xff0c;准备…

Python办公自动化教程(005):Word添加段落

文章目录 2.1 Python-docx介绍2.2 安装2.3 实例 2.1 Python-docx介绍 python-docx 是一个用于创建和修改 Microsoft Word 文档&#xff08;.docx 格式&#xff09;的 Python 库。它可以方便地生成和处理 Word 文档&#xff0c;而无需直接与 Microsoft Word 程序交互。 2.2 安…

运营弹性的 5 大支柱

作者&#xff1a;来自 Elastic Elastic Platform Team 什么是运营弹性&#xff1f; 没有哪个组织能够免受干扰。无论是错误的更新、有针对性的网络攻击&#xff0c;还是导致大规模供应链动荡的全球流行病&#xff0c;大多数公司在某个时候都会遇到障碍。这是增长的代价。但成功…

2024/10/5 英语每日一段

“There’s no reason, frankly, that someone who already has a passport and just needs to renew it shouldn’t be able to do that online, “Secretary of State Antony Blinken said at a March budget hearing. The State Department launched a pilot program for on…

ARM嵌入式学习--第一天

-ARM核介绍 -CPU核 CPU又叫中央处理器&#xff0c;其主要功能是进行算数运算和逻辑运算&#xff0c;内部结构大概可以分为控制单元&#xff0c;算术逻辑单元和储存单元等几个部分 -ARM核 工作模式&#xff1a; user mode:用户模式是用户程序的工作模式&#xff0c;他运行在操作…

Python并发编程(3)——Python多线程详解介绍

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 Python 的多线程入门是非常简单的&#xff0c;直接导入threading模块就可以开始多线程之旅了。模…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…

使用statsmodels解锁Python中的统计分析力量

使用 Python 中的 statsmodels 解锁统计分析的力量 引言 在不断发展的数据科学世界中&#xff0c;statsmodels 作为一个专为统计分析和计量经济学应用设计的 Python 库而脱颖而出。与更广泛的机器学习库不同&#xff0c;statsmodels 提供了专门设计的工具&#xff0c;用于深入…

Origin正态分布检验

在spass中用Shapiro-Wilk检验--正态分布检测 Shapiro-Wilk检验--正态分布检测_spss shapiro-wilk检验-CSDN博客

【路径规划】多机器人路径规划

摘要 多机器人路径规划在现代自动化、仓储管理及智能交通系统中有着广泛的应用。本文提出了一种基于A*算法的多机器人路径规划方法&#xff0c;旨在解决多机器人在同一环境中的路径冲突问题。通过采用启发式搜索和路径优化策略&#xff0c;机器人能够在保持避障的前提下实现最…

《Linux从小白到高手》理论篇:Linux的资源监控管理

本篇介绍Linux的资源监控管理。 1、CPU 资源管理 进程调度&#xff1a; Linux 采用公平的进程调度算法&#xff0c;确保每个进程都能获得合理的 CPU 时间。调度算法会根据进程的优先级、等待时间等因素来决定哪个进程获得 CPU 使用权。 可以通过调整进程的优先级来影响其获得…

wpf实现新用户页面引导

第一步 第二部 部分代码: private void show(int xh, FrameworkElement fe, string con, Visibility vis Visibility.Visible) {Point point fe.TransformToAncestor(Window.GetWindow(fe)).Transform(new Point(0, 0));//获取控件坐标点RectangleGeometry rg new Rectangl…

【Linux】进程详解:命令行参数、环境变量及地址空间

✨ 一生如牛不得闲&#xff0c;得闲已与山共眠 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &…

如何注册西柚云服务器账号?渠道优惠下单获得立减200优惠

1.什么是生信云服务器&#xff1f; 生信云服务器是一种专门为生物信息学领域打造的一体化服务解决方案&#xff0c;旨在满足生信科研群体的多样化需求。无论你是生物信息学的初学者&#xff0c;还是已经具备丰富经验的生信专家&#xff0c;这个平台都能够提供帮助。 满足不同…

【算法笔记】滑动窗口算法原理深度剖析

【算法笔记】滑动窗口算法原理深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】滑动窗口算法原理深度剖析前言一.长度最小的子数组1.1题目1.2思路分析1.3算法流程1.4正确性证明1.5代码实现 二.无重复…

C题(六) 1到 100 的所有整数中出现多少个数字9

场景&#xff1a;编写程序数一下 1到 100 的所有整数中出现多少个数字9 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#xff01; 控制循环的变量不可以随意改动&#xff01;&#xff01;&#x…

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional 1 卸载2 安装激活 1 卸载 参考文档: Link 删除安装目录 删掉之前压缩包解压出来的目录&#xff0c;例如&#xff1a;我之前是放在家目录下 rm -rf ~/pycharm-community-2023.2.1删除配置文件 rm -rf ~/.config…

JAVA运用中springBoot获取前端ajax提交参数方式汇总

本篇文章主要讲解springboot获取前端提交的参数信息&#xff0c;后端进行接受的常见方法汇总&#xff0c;通过本篇文章你可以快速掌握对表单和连接参数获取的能力。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月5日 一、delete、get等url参数获取方式 前台提交&#xf…