# Agora-Java-Server-SDK **Repository Path**: melovemingming/Agora-Java-Server-SDK ## Basic Information - **Project Name**: Agora-Java-Server-SDK - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-25 - **Last Updated**: 2025-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Agora Linux Server Java SDK 中文 | [English](./README.md) ## 目录 - [Agora Linux Server Java SDK](#agora-linux-server-java-sdk) - [目录](#目录) - [简介](#简介) - [开发环境要求](#开发环境要求) - [硬件环境](#硬件环境) - [软件环境](#软件环境) - [SDK 下载](#sdk-下载) - [Maven 下载](#maven-下载) - [CDN 下载](#cdn-下载) - [集成 SDK](#集成-sdk) - [1. Maven 集成](#1-maven-集成) - [1.1 添加 Maven 依赖](#11-添加-maven-依赖) - [1.2 集成 so 库文件](#12-集成-so-库文件) - [2. 本地 SDK 集成](#2-本地-sdk-集成) - [2.1 SDK 包结构](#21-sdk-包结构) - [2.2 集成 JAR 文件](#22-集成-jar-文件) - [本地 Maven 仓库方法](#本地-maven-仓库方法) - [直接引用方法](#直接引用方法) - [2.3 集成 so 库文件](#23-集成-so-库文件) - [3. 加载原生库 (.so 文件)](#3-加载原生库-so-文件) - [3.1 提取 so 库文件](#31-提取-so-库文件) - [3.2 配置加载路径](#32-配置加载路径) - [快速开始](#快速开始) - [官方示例文档](#官方示例文档) - [开通服务](#开通服务) - [运行 Examples-Mvn 示例工程](#运行-examples-mvn-示例工程) - [环境准备](#环境准备) - [项目配置](#项目配置) - [编译构建](#编译构建) - [运行示例](#运行示例) - [测试 case](#测试-case) - [API 参考](#api-参考) - [API 文档参考](#api-文档参考) - [VAD 模块](#vad-模块) - [VadV1 模块(仅支持Gateway SDK)](#vadv1-模块仅支持gateway-sdk) - [介绍](#介绍) - [类和方法](#类和方法) - [AgoraAudioVad 类](#agoraaudiovad-类) - [AgoraAudioVadConfig 类](#agoraaudiovadconfig-类) - [使用示例](#使用示例) - [VadV2 模块](#vadv2-模块) - [介绍](#介绍-1) - [类和方法](#类和方法-1) - [AgoraAudioVadV2 类](#agoraaudiovadv2-类) - [AgoraAudioVadConfigV2 属性](#agoraaudiovadconfigv2-属性) - [参数说明](#参数说明) - [方法](#方法) - [VadProcessResult](#vadprocessresult) - [构造方法](#构造方法) - [使用示例](#使用示例-1) - [Audio 3A 模块(仅支持Gateway SDK)](#audio-3a-模块仅支持gateway-sdk) - [介绍](#介绍-2) - [类和方法](#类和方法-2) - [AgoraAudioProcessor 类](#agoraaudioprocessor-类) - [构造方法](#构造方法-1) - [方法](#方法-1) - [AgoraAudioProcessorConfig 类](#agoraaudioprocessorconfig-类) - [方法](#方法-2) - [示例](#示例) - [IAgoraAudioProcessorEventHandler 接口](#iagoraaudioprocessoreventhandler-接口) - [方法](#方法-3) - [io.agora.rtc.audio3a.AgoraAudioFrame 类](#ioagorartcaudio3aagoraaudioframe-类) - [关键属性](#关键属性) - [主要方法 (Setters/Getters)](#主要方法-settersgetters) - [使用示例](#使用示例-2) - [更新日志](#更新日志) - [v4.4.32.200(2025-11-14)](#v44322002025-11-14) - [v4.4.32.101(2025-09-01)](#v44321012025-09-01) - [v4.4.32.100(2025-07-22)](#v44321002025-07-22) - [v4.4.32.1(2025-06-12)](#v443212025-06-12) - [v4.4.32(2025-05-27)](#v44322025-05-27) - [v4.4.31.4(2025-03-21)](#v443142025-03-21) - [v4.4.31.3(2025-02-26)](#v443132025-02-26) - [v4.4.31.2(2025-02-19)](#v443122025-02-19) - [v4.4.31.1(2025-01-06)](#v443112025-01-06) - [v4.4.31(2024-12-23)](#v44312024-12-23) - [v4.4.30.2(2024-11-20)](#v443022024-11-20) - [v4.4.30.1(2024-11-12)](#v443012024-11-12) - [v4.4.30(2024-10-24)](#v44302024-10-24) - [其他参考](#其他参考) ## 简介 Agora Linux Server Java SDK (v4.4.32.200) 为您提供了强大的实时音视频通信能力,可无缝集成到 Linux 服务器端 Java 应用程序中。借助此 SDK,您的服务器可以作为数据源或处理节点加入 Agora 频道,实时获取和处理音视频流,从而实现多种业务相关的其他高级功能。 Agora Linux Gateway SDK 暂未发布,相关功能暂未支持。 > 注意:如果您是从 v4.4.32.100 之前的版本升级到 v4.4.32.100 及以后版本,请参考《[AIQoS 版本升级指南](./AIQoS_Upgrade_Guide.md)》完成必要的 API 适配与集成变更。 ## 开发环境要求 ### 硬件环境 - **操作系统**:Ubuntu 18.04+ 或 CentOS 7.0+ - **CPU 架构**:x86-64 - **性能要求**: - CPU:8 核 1.8 GHz 或更高 - 内存:2 GB(推荐 4 GB+) - **网络要求**: - 公网 IP - 允许访问 `.agora.io` 和 `.agoralab.co` 域名 ### 软件环境 - Apache Maven 或其他构建工具 - JDK 8+ ## SDK 下载 ### Maven 下载 ```xml io.agora.rtc linux-java-sdk 4.4.32.200 ``` ### CDN 下载 [Agora-Linux-Java-SDK-v4.4.32.200-x86_64-964478-6b09067690-20251114_115603](https://download.agora.io/sdk/release/Agora-Linux-Java-SDK-v4.4.32.200-x86_64-964478-6b09067690-20251114_115603.zip) ## 集成 SDK SDK 集成有两种方式:通过 Maven 集成和本地 SDK 集成。 ### 1. Maven 集成 Maven 集成是最简单的方式,可以自动管理 Java 依赖关系。 #### 1.1 添加 Maven 依赖 在项目的 `pom.xml` 文件中添加以下依赖: ```xml io.agora.rtc linux-java-sdk 4.4.32.200 ``` #### 1.2 集成 so 库文件 Maven 依赖包含了所需的 JAR 文件,但仍需手动处理 `.so` 库文件才能运行。请参考下面的 **加载原生库 (.so 文件)** 部分。 ### 2. 本地 SDK 集成 本地 SDK 是一个包含所有必要文件的完整包,适合需要更灵活控制的场景。 #### 2.1 SDK 包结构 从官网下载的 SDK 包(zip 格式)包含以下内容: - **doc/** - JavaDoc 文档,详细的 API 说明 - **examples/** - 示例代码和项目 - **sdk/** - 核心 SDK 文件 - `agora-sdk.jar` - Java 类库 - `agora-sdk-javadoc.jar` - JavaDoc 文档 #### 2.2 集成 JAR 文件 你可以通过两种方式集成 JAR 文件: ###### 本地 Maven 仓库方法 方法一:只安装 SDK JAR ```sh mvn install:install-file \ -Dfile=sdk/agora-sdk.jar \ -DgroupId=io.agora.rtc \ -DartifactId=linux-java-sdk \ -Dversion=4.4.32.200 \ -Dpackaging=jar \ -DgeneratePom=true ``` 方法二:同时安装 SDK JAR 和 JavaDoc JAR ```sh mvn install:install-file \ -Dfile=sdk/agora-sdk.jar \ -DgroupId=io.agora.rtc \ -DartifactId=linux-java-sdk \ -Dversion=4.4.32.200 \ -Dpackaging=jar \ -DgeneratePom=true \ -Djavadoc=sdk/agora-sdk-javadoc.jar ``` 安装后,在 `pom.xml` 中添加依赖: ```xml io.agora.rtc linux-java-sdk 4.4.32.200 ``` ###### 直接引用方法 1. 将 JAR 文件复制到项目的 `libs` 目录: ```sh mkdir -p libs cp sdk/agora-sdk.jar libs/ cp sdk/agora-sdk-javadoc.jar libs/ # 可选,用于 IDE 支持 ``` 2. 在 Java 项目中添加 classpath 引用: ```sh # 使用 SDK JAR java -cp .:libs/agora-sdk.jar 你的主类 # 在 IDE 中配置 JavaDoc(常见的 IDE 如 IntelliJ IDEA 或 Eclipse 支持直接关联 JavaDoc JAR) ``` #### 2.3 集成 so 库文件 下载的 SDK 包中已经包含了 `.so` 文件。你需要确保 Java 程序运行时能够找到这些文件。请参考下面的 **加载原生库 (.so 文件)** 部分。 ### 3. 加载原生库 (.so 文件) Agora Linux Server Java SDK 依赖于底层的 C++ 原生库(`.so` 文件)。无论是通过 Maven 集成还是本地集成,都需要确保 Java 虚拟机 (JVM) 在运行时能够找到并加载这些库。 #### 3.1 提取 so 库文件 `.so` 文件包含在 `agora-sdk.jar` 或 `linux-java-sdk-x.x.x.x.jar` 文件内部。你需要先将它们提取出来: 1. 在你的项目或部署目录下创建一个用于存放库文件的目录,例如 `libs`: ```sh mkdir -p libs cd libs ``` 2. 使用 `jar` 命令从 SDK 的 JAR 文件中提取内容(假设 JAR 文件位于 `libs` 目录下或 Maven 缓存中): ```sh # 如果使用本地集成方式,JAR 文件通常在 libs 目录下 jar xvf agora-sdk.jar # 如果使用 Maven 集成方式,JAR 文件在 Maven 缓存中,例如: # jar xvf ~/.m2/repository/io/agora/rtc/linux-java-sdk/4.4.32.200/linux-java-sdk-4.4.32.200.jar ``` 3. 提取后,`libs` 目录下会生成 `native/linux/x86_64` 子目录,其中包含所需的 `.so` 文件: ``` libs/ ├── agora-sdk.jar (或者空的,如果仅用于提取) ├── io/ # Java 的 class 类所在,无需关注 ├── META-INF/ # JAR 文件和应用程序相关的元数据,无需关注 └── native/ # 对应平台的 so 库文件 └── linux/ └── x86_64/ # x86_64 平台 so 库 ├── libagora_rtc_sdk.so ├── libagora-fdkaac.so ├── libaosl.so └── libbinding.so ``` #### 3.2 配置加载路径 有两种主要方法让 JVM 找到 `.so` 文件: **方法一:通过设置环境变量 `LD_LIBRARY_PATH` (推荐)** 这是最可靠的方式,特别是在 `.so` 文件之间存在依赖关系时。 ```sh # 确定你的 .so 文件所在的目录,假设在 ./libs/native/linux/x86_64 LIB_DIR=$(pwd)/libs/native/linux/x86_64 # 设置 LD_LIBRARY_PATH 环境变量,将库目录添加到现有路径的前面 export LD_LIBRARY_PATH=$LIB_DIR:$LD_LIBRARY_PATH # 运行你的 Java 应用 java -jar 你的应用.jar # 或者使用 classpath # java -cp "你的classpath" 你的主类 ``` **方法二:通过 JVM 参数 `-Djava.library.path`** 这种方法直接告诉 JVM 在哪里查找库文件。 ```sh # 确定你的 .so 文件所在的目录,假设在 ./libs/native/linux/x86_64 LIB_DIR=$(pwd)/libs/native/linux/x86_64 # 运行 Java 应用,并通过 -D 参数指定库路径 java -Djava.library.path=$LIB_DIR -jar 你的应用.jar # 或者使用 classpath # java -Djava.library.path=$LIB_DIR -cp "你的classpath" 你的主类 ``` > **注意**: > > - 推荐使用方法一 (`LD_LIBRARY_PATH`),因为它能更好地处理库之间的依赖。如果仅使用 `-Djava.library.path`,有时可能因为库找不到其依赖的其他库而加载失败。 > - 确保 `$LIB_DIR` 指向包含 `libagora_rtc_sdk.so` 等文件的 **确切目录**。 > - 你可以将设置环境变量的命令放入启动脚本中,以便每次运行应用时自动配置。 参考以下脚本示例,它结合了两种方法,并设置了 classpath: ```sh #!/bin/bash # 获取当前脚本所在目录的绝对路径 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 确定 so 库文件路径 (假设在脚本目录下的 libs/native/linux/x86_64) LIB_PATH="$SCRIPT_DIR/libs/native/linux/x86_64" # SDK JAR 路径 (假设在脚本目录下的 libs) SDK_JAR="$SCRIPT_DIR/libs/agora-sdk.jar" # 你的应用主类 MAIN_CLASS="你的主类" # 你的应用的其他依赖 classpath (如果有) APP_CP="你的其他classpath" # 设置库路径环境变量 export LD_LIBRARY_PATH=$LIB_PATH:$LD_LIBRARY_PATH # 组合 classpath CLASSPATH=".:$SDK_JAR:$APP_CP" # '.' 表示当前目录 # 执行 Java 程序 # 同时使用 LD_LIBRARY_PATH 和 -Djava.library.path 以确保兼容性 java -Djava.library.path=$LIB_PATH -cp "$CLASSPATH" $MAIN_CLASS ``` ## 快速开始 ### 官方示例文档 参考 [官方示例文档](https://doc.shengwang.cn/doc/rtc-server-sdk/java/get-started/run-example) ### 开通服务 参考 [官网开通服务](https://doc.shengwang.cn/doc/rtc-server-sdk/java/get-started/enable-service) ### 运行 Examples-Mvn 示例工程 **Examples-Mvn** 是基于 Spring Boot 框架构建的 Maven 示例工程,提供了完整的 RESTful API 服务来演示 Agora Linux Server Java SDK 的各种功能特性。 该工程已集成了C++代码编译功能,可以在Maven构建过程中自动编译生成所需的.so库文件。 #### 环境准备 1. **安装 Maven 构建工具** 参考 [Maven 安装指南](https://maven.apache.org/install.html) ```bash sudo apt-get install maven -y sudo apt-get install lsof -y ``` 2. **C++ 编译环境 (如果需要编译native库, 默认可以跳过)** 安装基本编译工具: ```bash sudo apt-get update sudo apt-get install build-essential pkg-config gcc g++ ``` 3. **安装 C++ 运行时库** SDK 的原生库依赖于 `libc++` 运行时。请安装它以避免链接错误: ```bash sudo apt-get install libc++1 ``` 4. **FFmpeg 依赖 (如果需要编译FFmpeg相关功能, 默认可以跳过)** ```bash sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev ``` 5. **确保 JAVA_HOME 环境变量设置正确** ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ``` #### 项目配置 1. 进入 `Examples-Mvn` 目录: ```bash cd Examples-Mvn ``` 2. 创建 `.keys` 文件,添加: ``` APP_ID=your_app_id TOKEN=your_token ``` _如果未开启证书,TOKEN 值可为空,例如:_ ``` APP_ID=abcd1234 TOKEN= ``` 如果支持Gateway SDK,则需要创建 `.keys_gateway` 文件,添加: ``` APP_ID=your_app_id LICENSE=your_license ``` 3. 运行时配置 (run_config) `run_config` 文件用于配置运行时的各种选项,位于 `Examples-Mvn/run_config`。您可以根据需要修改以下配置: | 配置项 | 类型 | 默认值 | 描述 | | ------ | ---- | ------ | ---- || | enable_asan | boolean | false | 是否启用 AddressSanitizer,用于内存错误检测 | | enable_gateway | boolean | false | 是否启用 Gateway SDK 模式,启用后可使用 VAD 和 Audio 3A 等功能 | **配置示例:** ```bash # 启用 Gateway SDK 功能 enable_gateway=true # 启用内存检查(调试模式) enable_asan=true ``` > **注意**: > - 修改配置后需要重新编译项目 4. 配置Java SDK 本节介绍如何为您的Maven项目配置Linux Java SDK依赖。 4.1 步骤 1: 配置JAR包依赖 您有两种方式来配置项目的JAR依赖: 方式一:使用Maven中央仓库(推荐) 如果您的项目可以直接从Maven中央仓库获取依赖,请确保 `pom.xml` 中配置了正确的版本号。 ```xml io.agora.rtc linux-java-sdk 4.4.32.200 ``` 方式二:使用本地SDK包 如果您需要使用本地的SDK包(例如,经过定制化修改或内部版本),请遵循以下步骤: 1. **放置SDK构件**: 将下载的SDK JAR包 (例如 `agora-sdk.jar`) 和对应的Javadoc包 (`agora-sdk-javadoc.jar`) 放置到 `Examples-Mvn/libs/` 目录下。 2. **安装至本地Maven仓库**: 在 `linux_server_java` 目录下,执行以下脚本。该脚本会将 `libs` 目录下的JAR文件作为Maven构件安装到您的本地仓库中(通常位于 `~/.m2/repository`)。 ```bash ./build_install_local_maven.sh ``` 4.2 步骤 2: 配置原生库 (`.so`) 为了确保Java程序在运行时能成功加载原生库 (`.so` 文件),需要将它们放置在指定的路径。 1. **进入`libs`目录**: ```bash cd linux_server_java/Examples-Mvn/libs/ ``` 2. **从JAR包中解压原生库**: ```bash # -x: extract, -v: verbose, -f: file jar -xvf agora-sdk.jar native/ ``` 此命令会从 `agora-sdk.jar` 中提取 `native` 目录,其中包含了所有平台的原生库。 3. **验证目录结构**: 解压后,`libs` 目录结构应如下所示,确保 `.so` 文件位于 `native/linux/x86_64/` 路径下: ```text libs/ ├── agora-sdk.jar ├── agora-sdk-javadoc.jar └── native/ └── linux/ └── x86_64/ ├── libagora_rtc_sdk.so ├── libagora-fdkaac.so └── ... (其他 .so 文件) ``` #### 编译构建 执行编译脚本: ```bash # 标准Maven构建 (不编译native代码) ./build.sh # 编译并启动服务 ./build.sh start # 编译所有native库 ./build.sh -native # 编译所有native库并启动服务 ./build.sh -native start # 只编译FFmpeg相关库 ./build.sh -ffmpegUtils # 只编译Media相关库 ./build.sh -mediaUtils ``` **编译选项说明:** - 默认情况下仅编译Java项目,不编译C++代码 - 使用 `-native` 选项编译所有native库(FFmpeg + Media) - 使用 `-ffmpegUtils` 选项只编译FFmpeg相关库(用于MP4处理) - 使用 `-mediaUtils` 选项只编译Media相关库(用于编码音视频处理) - 使用 `start` 选项可在编译完成后自动启动服务 **使用Maven命令:** 你也可以直接使用Maven命令: ```bash # 编译所有native库 mvn clean package -Dbuild.native=true # 只编译FFmpeg库 mvn clean package -Dbuild.ffmpeg=true # 只编译Media库 mvn clean package -Dbuild.media=true ``` #### 运行示例 启动服务后,使用浏览器或 Postman 访问以下接口地址,测试各种功能: **基础功能测试接口:** ``` http://localhost:18080/api/server/basic?taskName=ReceiverPcmDirectSendTest http://localhost:18080/api/server/basic?taskName=ReceiverPcmH264Test http://localhost:18080/api/server/basic?taskName=ReceiverPcmVadTest http://localhost:18080/api/server/basic?taskName=ReceiverPcmYuvTest http://localhost:18080/api/server/basic?taskName=SendH264Test http://localhost:18080/api/server/basic?taskName=SendMp4Test http://localhost:18080/api/server/basic?taskName=SendOpusTest http://localhost:18080/api/server/basic?taskName=SendPcmFileTest http://localhost:18080/api/server/basic?taskName=SendPcmRealTimeTest http://localhost:18080/api/server/basic?taskName=SendReceiverStreamMessageTest http://localhost:18080/api/server/basic?taskName=SendYuvTest ``` **Gateway SDK 专属功能:** ``` http://localhost:18080/api/server/basic?taskName=VadV1Test http://localhost:18080/api/server/basic?taskName=Audio3aTest ``` **配置文件接口:** ``` http://localhost:18080/api/server/start?configFileName=pcm_send.json ``` > **注意**:请将 `localhost:18080` 替换为您的实际服务器地址和端口。 #### 测试 case - 发送 PCM 音频 参考 [SendPcmFileTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendPcmFileTest.java),实现循环发送 pcm 文件 参考 [SendPcmRealTimeTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendPcmRealTimeTest.java),实现发送流式 pcm 数据 - 发送 YUV 视频 参考 [SendYuvTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendYuvTest.java),实现流式发送 yuv 数据 - 发送 H264 视频 参考 [SendH264Test.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendH264Test.java),实现流式发送 h264 数据 - 发送 Opus 音频 参考 [SendOpusTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendOpusTest.java),实现流式发送 opus 数据 - 发送 MP4 音视频 参考 [SendMp4Test.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendMp4Test.java),实现发送 MP4 文件 - 接收 PCM 音频 参考 [ReceiverPcmVadTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/ReceiverPcmVadTest.java),实现接收 pcm 数据并携带 VAD 数据 参考 [ReceiverPcmDirectSendTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/ReceiverPcmDirectSendTest.java),实现接收 pcm 数据并直接返回发送 - 接收 PCM&H264 音视频 参考 [ReceiverPcmH264Test.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/ReceiverPcmH264Test.java),实现接收 pcm&h264 数据 - 接收 PCM&YUV 音视频 参考 [ReceiverPcmYuvTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/ReceiverPcmYuvTest.java),实现接收 pcm&yuv 数据 - 发送接收流消息 参考 [SendReceiverStreamMessageTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/SendReceiverStreamMessageTest.java),实现发送接收流消息 - VadV1 模块(仅支持Gateway SDK) 参考 [VadV1Test.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/VadV1Test.java.disabled),实现 VadV1 模块 - 音频 3A 处理(仅支持Gateway SDK) 参考 [Audio3aTest.java](./Examples-Mvn/src/main/java/io/agora/rtc/example/basic/Audio3aTest.java.disabled),实现音频 3A 处理 ## API 参考 ### API 文档参考 完整 API 文档可参考以下资源: - [API-reference.zh.md](./API-reference.zh.md) 文件(仅供参考) - 官方文档 [Agora Java Server SDK API 参考](https://doc.shengwang.cn/api-ref/rtc-server-sdk/java/overview)(以官方文档为准) ### VAD 模块 #### VadV1 模块(仅支持Gateway SDK) ##### 介绍 `AgoraAudioVad` 是一个用于处理音频帧的语音活动检测 (VAD) 模块。它可以检测音频流中的语音活动,并根据配置参数进行处理。该模块是 VAD 的第一个版本,提供基础的语音活动检测功能。 ##### 类和方法 ###### AgoraAudioVad 类 **构造方法** ```java public AgoraAudioVad() ``` - **描述**:构造一个 `AgoraAudioVad` 实例。 **方法** ```java public int initialize(AgoraAudioVadConfig config) ``` - **描述**:初始化 VAD 模块。必须在使用其他方法前调用。 - **参数**: - `config`:`AgoraAudioVadConfig` 类型,VAD 配置。 - **返回**:`int` 类型,0 表示成功,-1 表示失败。 ```java public VadProcessResult processPcmFrame(byte[] frame) ``` - **描述**:处理 PCM 音频帧。 - **参数**: - `frame`:`byte[]` 类型,PCM 音频数据。 - **返回**:`VadProcessResult` 类型,VAD 处理结果。 ```java public synchronized void destroy() ``` - **描述**:销毁 VAD 模块,释放资源。 ###### AgoraAudioVadConfig 类 **主要属性** | 属性名 | 类型 | 描述 | 默认值 | 取值范围 | | ---------------------- | ----- | ------------------------------------ | ------ | ---------------------- | | fftSz | int | FFT 大小,仅支持 128、256、512、1024 | 1024 | [128, 256, 512, 1024] | | hopSz | int | FFT 跳跃大小,用于检查 | 160 | [1, Integer.MAX_VALUE] | | anaWindowSz | int | FFT 窗口大小,用于计算 RMS | 768 | [1, Integer.MAX_VALUE] | | voiceProbThr | float | 语音概率阈值 | 0.7 | [0.0, 1.0] | | rmsThr | float | RMS 阈值(dB) | -40.0 | [-100.0, 0.0] | | jointThr | float | 联合阈值(dB) | 0.0 | [-100.0, 100.0] | | aggressive | float | 激进因子,值越大越激进 | 2.0 | [0.0, 10.0] | | startRecognizeCount | int | 开始识别计数 | 30 | [1, Integer.MAX_VALUE] | | stopRecognizeCount | int | 停止识别计数 | 48 | [1, Integer.MAX_VALUE] | | preStartRecognizeCount | int | 预开始识别计数 | 16 | [0, Integer.MAX_VALUE] | | activePercent | float | 活跃百分比 | 0.8 | [0.0, 1.0] | | inactivePercent | float | 非活跃百分比 | 0.2 | [0.0, 1.0] | ##### 使用示例 下面是一个简单的示例代码,展示如何使用 `AgoraAudioVad` 进行音频帧处理: ```java import io.agora.rtc.AgoraAudioVad; import io.agora.rtc.AgoraAudioVadConfig; import io.agora.rtc.VadProcessResult; import java.io.FileInputStream; public class VadV1Example { public static void main(String[] args) { // 创建 VAD 实例 AgoraAudioVad audioVad = new AgoraAudioVad(); // 创建配置 AgoraAudioVadConfig config = new AgoraAudioVadConfig(); // 可以根据需要调整配置参数,建议使用默认值 // 初始化 VAD int ret = audioVad.initialize(config); if (ret != 0) { System.err.println("Failed to initialize VAD: " + ret); return; } // 处理音频帧 try { // 假设有 PCM 音频数据 byte[] pcmData = new byte[320]; // 10ms 16kHz 单声道 PCM16 数据 VadProcessResult result = audioVad.processPcmFrame(pcmData); if (result != null) { System.out.println("VAD State: " + result.getState()); if (result.getOutFrame() != null) { System.out.println("Output Frame Length: " + result.getOutFrame().length); } } } catch (Exception e) { e.printStackTrace(); } // 销毁 VAD 实例 audioVad.destroy(); } } ``` #### VadV2 模块 ##### 介绍 `AgoraAudioVadV2` 是一个用于处理音频帧的语音活动检测 (VAD) 模块的第二个版本。它可以检测音频流中的语音活动,并根据配置参数进行处理。 ##### 类和方法 ###### AgoraAudioVadV2 类 **构造方法** ```java public AgoraAudioVadV2(AgoraAudioVadConfigV2 config) ``` - **参数** - `config`:`AgoraAudioVadConfigV2` 类型,VAD 配置。 ###### AgoraAudioVadConfigV2 属性 | 属性名 | 类型 | 描述 | 默认值 | 取值范围 | | ---------------------------- | ------- | ------------------------------------------ | ------ | ---------------------- | | preStartRecognizeCount | int | 开始说话状态前保存的音频帧数 | 16 | [0, Integer.MAX_VALUE] | | startRecognizeCount | int | 说话状态的音频帧数 | 30 | [1, Integer.MAX_VALUE] | | stopRecognizeCount | int | 停止说话状态的音频帧数 | 65 | [1, Integer.MAX_VALUE] | | activePercent | float | 在 startRecognizeCount 帧中活跃帧的百分比 | 0.7 | [0.0, 1.0] | | inactivePercent | float | 在 stopRecognizeCount 帧中非活跃帧的百分比 | 0.5 | [0.0, 1.0] | | startVoiceProb | int | 开始语音检测的概率阈值 | 70 | [0, 100] | | stopVoiceProb | int | 停止语音检测的概率阈值 | 70 | [0, 100] | | startRmsThreshold | int | 开始语音检测的 RMS 阈值 (dB) | -70 | [-100, 0] | | stopRmsThreshold | int | 停止语音检测的 RMS 阈值 (dB) | -70 | [-100, 0] | | enableAdaptiveRmsThreshold | boolean | 是否启用自适应 RMS 阈值 | true | true/false | | adaptiveRmsThresholdFactor | float | 自适应 RMS 阈值因子 | 0.67 | [0.0, 1.0] | ###### 参数说明 **窗口大小参数**: - `preStartRecognizeCount`: 预启动缓冲帧数,用于保留语音开头部分(16帧 = 160ms) - `startRecognizeCount`: 启动检测窗口大小,判断是否开始说话(30帧 = 300ms) - `stopRecognizeCount`: 停止检测窗口大小,判断是否停止说话(65帧 = 650ms) **百分比阈值**: - `activePercent`: 启动活动帧比例阈值(默认0.7 = 70%),值越高启动越严格 - `inactivePercent`: 停止非活动帧比例阈值(默认0.5 = 50%),值越高停止越快 **语音概率阈值**: - `startVoiceProb`: 启动语音概率阈值(0-100),值越低越敏感,更早开始检测 - `stopVoiceProb`: 停止语音概率阈值(0-100),值越高越早停止检测 **RMS 能量阈值**: - `startRmsThreshold`: 启动 RMS 阈值(dB),值越高对语音越敏感 - 安静环境:-70 dB(默认) - 噪声环境:-50 到 -40 dB - 高噪声环境:-40 到 -30 dB - `stopRmsThreshold`: 停止 RMS 阈值(dB),通常与 startRmsThreshold 保持一致 **自适应阈值**: - `enableAdaptiveRmsThreshold`: 启用后根据历史语音统计自动调整 RMS 阈值,提高环境适应性 - `adaptiveRmsThresholdFactor`: 自适应因子(默认0.67 = 2/3),值越小阈值越低越敏感 ###### 方法 ```java public synchronized VadProcessResult processFrame(AudioFrame frame) ``` - **参数** - `frame`:`AudioFrame` 类型,音频帧。 - **返回** - `VadProcessResult` 类型,VAD 处理结果。 ```java public synchronized void destroy() ``` - 销毁 VAD 模块,释放资源。 ##### VadProcessResult 存储 VAD 处理结果。 ###### 构造方法 ```java public VadProcessResult(byte[] result, Constants.VadState state) ``` - **参数** - `result`:`byte[]` 类型,处理后的音频数据。 - `state`:`Constants.VadState` 类型,当前 VAD 状态。 ##### 使用示例 下面是一个简单的示例代码,展示如何使用 `AgoraAudioVadV2` 进行音频帧处理: ```java import io.agora.rtc.AgoraAudioVadV2; import io.agora.rtc.AgoraAudioVadConfigV2; import io.agora.rtc.Constants; import io.agora.rtc.AudioFrame; import io.agora.rtc.VadProcessResult; public class VadV2Example { public static void main(String[] args) { // 创建 VAD 配置 AgoraAudioVadConfigV2 config = new AgoraAudioVadConfigV2(); // 以下为默认值,可根据需要调整 config.setPreStartRecognizeCount(16); config.setStartRecognizeCount(30); config.setStopRecognizeCount(65); config.setActivePercent(0.7f); config.setInactivePercent(0.5f); config.setStartVoiceProb(70); config.setStopVoiceProb(70); config.setStartRmsThreshold(-70); config.setStopRmsThreshold(-70); config.setEnableAdaptiveRmsThreshold(true); config.setAdaptiveRmsThresholdFactor(0.67f); // 创建 VAD 实例 AgoraAudioVadV2 vad = new AgoraAudioVadV2(config); // 模拟音频帧处理 AudioFrame frame = new AudioFrame(); // 设置 frame 的属性 frame.setType(Constants.AudioFrameType.PCM16.getValue()); frame.setSamplesPerSec(16000); // 16kHz frame.setChannels(1); // 单声道 frame.setSamplesPerChannel(160); // 10ms 帧,16000/100 = 160 frame.setBytesPerSample(Constants.BytesPerSample.TWO_BYTES_PER_SAMPLE.getValue()); // PCM16 // 设置音频数据缓冲区 byte[] pcmData = new byte[320]; // 160 samples * 1 channel * 2 bytes // ... 填充 PCM 数据 ... java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocateDirect(320); buffer.put(pcmData); buffer.flip(); frame.setBuffer(buffer); VadProcessResult result = vad.processFrame(frame); if (result != null) { System.out.println("VAD State: " + result.getState()); if (result.getOutFrame() != null) { System.out.println("Processed Data Length: " + result.getOutFrame().length); } } // 销毁 VAD 实例 vad.destroy(); } } ``` ### Audio 3A 模块(仅支持Gateway SDK) #### 介绍 `AgoraAudioProcessor` 是一个用于音频 3A(AEC、ANS、AGC)以及背景人声抑制(BGHVS)处理的模块。它可以对音频帧进行声学回声消除 (AEC)、自动噪声抑制 (ANS)、自动增益控制 (AGC) 和背景人声抑制 (BGHVS),以提升音频质量。该模块需要相应的模型文件来执行处理。 #### 类和方法 ##### AgoraAudioProcessor 类 ###### 构造方法 ```java public AgoraAudioProcessor() ``` - **描述**:构造一个 `AgoraAudioProcessor` 实例。 ###### 方法 ```java public int init(String appId, String license, IAgoraAudioProcessorEventHandler eventHandler, AgoraAudioProcessorConfig config) ``` - **描述**:初始化音频处理器。必须在使用其他方法前调用。 - **参数**: - `appId`:`String` 类型,声网后台获取的 App ID。 - `license`:`String` 类型,声网后台获取的 License。 - `eventHandler`:`IAgoraAudioProcessorEventHandler` 类型,用于接收处理器事件和错误的回调处理器。 - `config`:`AgoraAudioProcessorConfig` 类型,3A 处理器配置对象,用于配置模型路径等。 - **返回**:`int` 类型,0 表示成功,其他值表示失败。 ```java public AgoraAudioFrame process(AgoraAudioFrame nearIn) ``` - **描述**:对输入的近端音频帧进行 3A 处理(如 ANS、AGC)。当仅处理近端音频,或不需要 AEC 处理时使用此方法。 - **参数**: - `nearIn`:`io.agora.rtc.audio3a.AgoraAudioFrame` 类型,包含待处理的近端 PCM 音频数据的帧对象。 - **返回**:`io.agora.rtc.audio3a.AgoraAudioFrame` 类型,处理后的音频帧。如果处理失败,可能返回 `null`。 ```java public AgoraAudioFrame process(AgoraAudioFrame nearIn, AgoraAudioFrame farIn) ``` - **描述**:对输入的近端和远端音频帧进行 3A 处理(如 AEC、ANS、AGC)。当需要进行回声消除 (AEC) 等同时处理近端和远端音频的场景时使用此方法。 - **参数**: - `nearIn`:`io.agora.rtc.audio3a.AgoraAudioFrame` 类型,包含待处理的近端 PCM 音频数据的帧对象。 - `farIn`:`io.agora.rtc.audio3a.AgoraAudioFrame` 类型,包含参考的远端 PCM 音频数据的帧对象,主要用于声学回声消除 (AEC)。 - **返回**:`io.agora.rtc.audio3a.AgoraAudioFrame` 类型,处理后的近端音频帧。如果处理失败,可能返回 `null`。 ```java public int release() ``` - **描述**:释放 `AgoraAudioProcessor` 实例所占用的所有资源。处理完成后应调用此方法。 - **返回**:`int` 类型,0 表示成功,其他值表示失败。 ##### AgoraAudioProcessorConfig 类 此类用于配置 `AgoraAudioProcessor`。 ###### 方法 ```java public void setModelPath(String modelPath) ``` - **描述**: 设置 3A 处理所需的模型文件路径。模型文件通常随 SDK 包提供,位于 `resources/model/` 目录下。 - **参数**: - `modelPath`: `String` 类型,模型文件所在的目录路径。例如 `./resources/model/`。 ```java public void setAecConfig(AecConfig aecConfig) public AecConfig getAecConfig() ``` - **描述**: 设置和获取声学回声消除(AEC)配置。 - **参数**: - `aecConfig`: `AecConfig` 类型,AEC 配置对象。 ```java public void setAnsConfig(AnsConfig ansConfig) public AnsConfig getAnsConfig() ``` - **描述**: 设置和获取自动噪声抑制(ANS)配置。 - **参数**: - `ansConfig`: `AnsConfig` 类型,ANS 配置对象。 ```java public void setAgcConfig(AgcConfig agcConfig) public AgcConfig getAgcConfig() ``` - **描述**: 设置和获取自动增益控制(AGC)配置。 - **参数**: - `agcConfig`: `AgcConfig` 类型,AGC 配置对象。 ```java public void setBghvsConfig(BghvsConfig bghvsConfig) public BghvsConfig getBghvsConfig() ``` - **描述**: 设置和获取背景人声抑制(BGHVS)配置。 - **参数**: - `bghvsConfig`: `BghvsConfig` 类型,BGHVS 配置对象。 ###### 示例 ```java AgoraAudioProcessorConfig config = new AgoraAudioProcessorConfig(); config.setModelPath("./resources/model/"); // 根据实际模型文件位置进行设置 // 配置 AEC AecConfig aecConfig = new AecConfig(); aecConfig.setEnabled(true); config.setAecConfig(aecConfig); // 配置 ANS AnsConfig ansConfig = new AnsConfig(); ansConfig.setEnabled(true); config.setAnsConfig(ansConfig); // 配置 AGC AgcConfig agcConfig = new AgcConfig(); agcConfig.setEnabled(true); config.setAgcConfig(agcConfig); // 配置 BGHVS BghvsConfig bghvsConfig = new BghvsConfig(); bghvsConfig.setEnabled(true); config.setBghvsConfig(bghvsConfig); ``` ##### IAgoraAudioProcessorEventHandler 接口 此接口用于接收来自 `AgoraAudioProcessor` 的事件和错误通知。 ###### 方法 ```java public void onEvent(Constants.AgoraAudioProcessorEventType eventType) ``` - **描述**:报告处理器在运行过程中发生的事件。 - **参数**: - `eventType`:`io.agora.rtc.Constants.AgoraAudioProcessorEventType` 类型,具体的事件类型。 ```java public void onError(int errorCode) ``` - **描述**:报告处理器在运行过程中发生的错误。 - **参数**: - `errorCode`:`int` 类型,错误码,指示发生的具体错误。 ##### io.agora.rtc.audio3a.AgoraAudioFrame 类 此类用于封装音频数据以供 `AgoraAudioProcessor` 处理。 (注意:这与 `io.agora.rtc.AudioFrame` 可能不同,请使用 `audio3a` 包下的版本) ###### 关键属性 | 属性名 | 类型 | 描述 | | ----------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | | type | int | 音频帧类型,通常为 `Constants.AudioFrameType.PCM16.getValue()`。 | | sampleRate | int | 音频采样率 (Hz),例如 16000, 32000, 48000。 | | channels | int | 音频通道数,例如 1 (单声道) 或 2 (立体声)。 | | samplesPerChannel | int | 每个通道的采样点数量。对于 10ms 的帧,通常是 `sampleRate / 100`。 | | bytesPerSample | int | 每个采样点的字节数。例如 PCM16 格式为 2 字节 (`Constants.BytesPerSample.TWO_BYTES_PER_SAMPLE.getValue()`)。 | | buffer | ByteBuffer | 包含原始 PCM 音频数据的 `java.nio.ByteBuffer`。 | ###### 主要方法 (Setters/Getters) ```java public void setType(int type); public int getType(); public void setSampleRate(int sampleRate); public int getSampleRate(); public void setChannels(int channels); public int getChannels(); public void setSamplesPerChannel(int samplesPerChannel); public int getSamplesPerChannel(); public void setBytesPerSample(int bytesPerSample); public int getBytesPerSample(); public void setBuffer(java.nio.ByteBuffer buffer); public java.nio.ByteBuffer getBuffer(); ``` #### 使用示例 以下是一个简单的示例代码,展示如何使用 `AgoraAudioProcessor` 进行音频帧处理: ```java import io.agora.rtc.audio3a.AgoraAudioProcessor; import io.agora.rtc.audio3a.AgoraAudioProcessorConfig; import io.agora.rtc.audio3a.IAgoraAudioProcessorEventHandler; import io.agora.rtc.audio3a.AgoraAudioFrame; // 使用 audio3a 包下的 AgoraAudioFrame import io.agora.rtc.audio3a.AecConfig; import io.agora.rtc.audio3a.AnsConfig; import io.agora.rtc.audio3a.AgcConfig; import io.agora.rtc.audio3a.BghvsConfig; import io.agora.rtc.Constants; // SDK 的常量类 import java.nio.ByteBuffer; import java.util.Arrays; // 用于打印数据示例 public class Audio3AProcessingExample { public static void main(String[] args) { // 替换为您的 App ID 和 License String appId = "YOUR_APP_ID"; String license = "YOUR_LICENSE_KEY"; // 1. 创建 AgoraAudioProcessor 实例 AgoraAudioProcessor audioProcessor = new AgoraAudioProcessor(); // 2. 配置 AgoraAudioProcessorConfig AgoraAudioProcessorConfig config = new AgoraAudioProcessorConfig(); // 设置模型文件路径,通常在 SDK 包的 resources/model/ 目录下 // 请确保路径正确,否则初始化可能失败 config.setModelPath("./resources/model/"); // 根据您的实际路径修改 // 配置 AEC(声学回声消除) AecConfig aecConfig = config.getAecConfig(); aecConfig.setEnabled(true); // 启用 AEC // 配置 ANS(自动噪声抑制) AnsConfig ansConfig = config.getAnsConfig(); ansConfig.setEnabled(true); // 启用 ANS // 配置 AGC(自动增益控制) AgcConfig agcConfig = config.getAgcConfig(); agcConfig.setEnabled(true); // 启用 AGC // 配置 BGHVS(背景人声抑制) BghvsConfig bghvsConfig = config.getBghvsConfig(); bghvsConfig.setEnabled(true); // 启用 BGHVS // 3. 初始化 AgoraAudioProcessor int initRet = audioProcessor.init(appId, license, new IAgoraAudioProcessorEventHandler() { @Override public void onEvent(Constants.AgoraAudioProcessorEventType eventType) { System.out.println("AgoraAudioProcessor Event: " + eventType); } @Override public void onError(int errorCode) { System.err.println("AgoraAudioProcessor Error: " + errorCode); } }, config); if (initRet != 0) { System.err.println("Failed to initialize AgoraAudioProcessor. Error code: " + initRet); // 根据错误码处理初始化失败的情况,例如检查 appId, license, modelPath 是否正确 return; } System.out.println("AgoraAudioProcessor initialized successfully."); // 4. 准备音频帧 (AgoraAudioFrame) // 示例参数:48kHz, 单声道, 10ms 音频帧 int sampleRate = 48000; int channels = 1; int samplesPerChannel = sampleRate / 100; // 10ms frame -> 480 samples int bytesPerSample = Constants.BytesPerSample.TWO_BYTES_PER_SAMPLE.getValue(); // PCM16 int bufferSize = samplesPerChannel * channels * bytesPerSample; // 创建近端音频帧 AgoraAudioFrame nearInFrame = new AgoraAudioFrame(); nearInFrame.setType(Constants.AudioFrameType.PCM16.getValue()); nearInFrame.setSampleRate(sampleRate); nearInFrame.setChannels(channels); nearInFrame.setSamplesPerChannel(samplesPerChannel); nearInFrame.setBytesPerSample(bytesPerSample); // 实际应用中,这里的 pcmDataNear 来自近端音频源 byte[] pcmDataNear = new byte[bufferSize]; // ... 此处用虚拟数据填充 pcmDataNear ... ByteBuffer nearAudioBuffer = ByteBuffer.allocateDirect(bufferSize); nearAudioBuffer.put(pcmDataNear); nearAudioBuffer.flip(); nearInFrame.setBuffer(nearAudioBuffer); // 创建远端音频帧 (用于 AEC) AgoraAudioFrame farInFrame = new AgoraAudioFrame(); farInFrame.setType(Constants.AudioFrameType.PCM16.getValue()); farInFrame.setSampleRate(sampleRate); farInFrame.setChannels(channels); farInFrame.setSamplesPerChannel(samplesPerChannel); farInFrame.setBytesPerSample(bytesPerSample); // 实际应用中,这里的 pcmDataFar 来自远端音频源 byte[] pcmDataFar = new byte[bufferSize]; // ... 此处用虚拟数据填充 pcmDataFar ... ByteBuffer farAudioBuffer = ByteBuffer.allocateDirect(bufferSize); farAudioBuffer.put(pcmDataFar); farAudioBuffer.flip(); farInFrame.setBuffer(farAudioBuffer); // 5. 处理音频帧 // 如果只需要处理近端音频(例如仅 ANS, AGC),可以调用单参数的 process 方法: // AgoraAudioFrame outputFrame = audioProcessor.process(nearInFrame); // 如果需要 AEC 处理,同时传入近端和远端音频帧 AgoraAudioFrame outputFrame = audioProcessor.process(nearInFrame, farInFrame); if (outputFrame != null && outputFrame.getBuffer() != null) { System.out.println("Audio frame processed successfully."); ByteBuffer processedBuffer = outputFrame.getBuffer(); // processedBuffer 包含了经过 3A + BGHVS 处理的音频数据 // 处理后的音频将具有以下优化: // - AEC: 消除声学回声 // - ANS: 抑制背景噪声 // - AGC: 自动调节音量增益 // - BGHVS: 抑制背景人声干扰 // 您可以将数据写入文件、发送到网络或进行其他操作 // 例如,获取处理后的字节数据: // byte[] processedBytes = new byte[processedBuffer.remaining()]; // processedBuffer.get(processedBytes); // System.out.println("Processed data sample (first 10 bytes): " + // Arrays.toString(Arrays.copyOfRange(processedBytes, 0, Math.min(10, processedBytes.length)))); } else { System.err.println("Failed to process audio frame or output frame is null."); // 检查是否有错误回调,或 process 方法的返回值 } // 6. 释放资源 int releaseRet = audioProcessor.release(); if (releaseRet == 0) { System.out.println("AgoraAudioProcessor released successfully."); } else { System.err.println("Failed to release AgoraAudioProcessor. Error code: " + releaseRet); } } } ``` ## 更新日志 ### v4.4.32.200(2025-11-14) - **API 变更** - **AgoraServiceConfig**: 新增 `enableApm` 和 `apmConfig` 属性,支持配置 APM(Audio Processing Module)模块。 - **改进与优化** - 优化了 VAD V2 的默认配置参数,提升语音活动检测的准确性。 - 修复了 Audio 和 Video 回调参数中pts值的准确性问题。 ### v4.4.32.101(2025-09-01) - **API 变更** - **AudioFrame**: 新增 `presentationMs` 字段及 getter/setter,用于透传音频帧 PTS(毫秒)。 - **EncodedVideoFrameInfo**: 新增 `presentationMs` 字段及构造参数;可用于传入视频帧 PTS(毫秒)。 - **EncodedAudioFrameInfo**: 新增 `captureTimeMs` 字段及构造参数;用于记录采集时间戳(毫秒)。 - **AgoraRtcConn**: 新增重载 `pushAudioPcmData(byte[] data, int sampleRate, int channels, long presentationMs)`;原有 `pushAudioPcmData(byte[] data, int sampleRate, int channels)` 仍可用(等价于 `presentationMs=0`)。 - **改进与优化** - 修复 `IAudioFrameObserver` 回调在极端场景下可能出现的异常问题,提升回调稳定性。 ### v4.4.32.100(2025-07-22) - **API 变更** - 该版本支持AIQoS,同时API有变更,请参考[AIQoS升级指南](AIQoS_Upgrade_Guide.md) ### v4.4.32.1(2025-06-12) - **API 变更** - 优化 `ILocalUserObserver` 接口的 `onStreamMessage` 回调参数,将原有的 `onStreamMessage(AgoraLocalUser agoraLocalUser, String userId, int streamId, String data, long length)` 修改为 `onStreamMessage(AgoraLocalUser agoraLocalUser, String userId, int streamId, byte[] data)`,提升消息处理的灵活性和效率。 - **改进与优化** - 修复了 `AgoraServiceConfig` 的 `setLogFileSize` 方法,单位为 KB 时实际生效单位为 Byte 的问题,现已正确按 KB 设置日志文件大小。 ### v4.4.32(2025-05-27) - **API 变更** - `AgoraService` 新增 `getSdkVersion` 方法,用于获取 SDK 版本号 - `AgoraAudioEncodedFrameSender` 移除 `send(byte[] payloadData, int payloadSize, EncodedAudioFrameInfo info)` 方法,新增 `sendEncodedAudioFrame(byte[] payloadData, EncodedAudioFrameInfo info)` 方法替代 - `AgoraAudioPcmDataSender` 的 `send(byte[] audioData, int captureTimestamp, int samplesPerChannel, int bytesPerSample, int numberOfChannels, int sampleRate) ` 方法标位不推荐,新增 `sendAudioPcmData(AudioFrame audioFrame)` 方法替代 - `AgoraVideoEncodedImageSender` 移除 `send(byte[] imageBuffer, int length, EncodedVideoFrameInfo info` 方法,新增 `sendEncodedVideoImage(byte[] imageBuffer, EncodedVideoFrameInfo info)` 方法替代 - `AgoraVideoFrameSender` 移除 `send(ExternalVideoFrame frame)` 方法,新增 `sendVideoFrame(ExternalVideoFrame frame)` 方法替代 - **改进与优化** - 修复了 `destroy` 方法可能导致的崩溃问题 ### v4.4.31.4(2025-03-21) - **改进与优化** - 修复了多线程环境下可能导致的异常崩溃问题 - 改进了错误处理流程,增强了异常情况下的恢复能力 ### v4.4.31.3(2025-02-26) - **改进与优化** - 修复了由于内存复用可能导致的异常处理问题 ### v4.4.31.2(2025-02-19) - **API 变更** - 新增 `sendStreamMessage(int streamId, byte[] messageData)` 方法,弃用 `sendStreamMessage(int streamId, String message, int length)` 方法 - **改进与优化** - 优化代码处理,提高系统稳健性 ### v4.4.31.1(2025-01-06) - **改进与优化** - 优化 VAD 功能配置,现在默认开启 VAD 功能,无需手动配置 ### v4.4.31(2024-12-23) - **API 变更** - 在 `AgoraServiceConfig` 中新增 `DomainLimit` 配置选项,用于域名限制管理 - 新增 `VadDumpUtils` 工具类,支持导出 VAD 处理过程的调试数据 - 新增 `AudioConsumerUtils` 类,提供优化的 PCM 数据传输机制 - 在 `AgoraLocalUser` 中修改 `registerAudioFrameObserver` 方法,支持配置 `AgoraAudioVadConfigV2` 参数 - 在 `IAudioFrameObserver` 中新增 `onPlaybackAudioFrameBeforeMixing` 回调的 `vadResult` 参数 - 在 `AgoraLocalUser` 类中新增 `sendAudioMetaData` 方法,支持发送音频元数据 - 在 `ILocalUserObserver` 类中新增 `onAudioMetaDataReceived` 回调,用于接收音频元数据 - 在 `ExternalVideoFrame` 类中增加 `ColorSpace` 属性,支持自定义颜色空间设置 - **改进与优化** - 优化代码逻辑架构,显著提升内存使用效率 - 修复多处内存泄露问题,提高系统稳定性 - 增强内存访问安全机制,有效防止内存踩踏问题 ### v4.4.30.2(2024-11-20) **API 变更** - 增强了 AgoraAudioVadV2 的 `processFrame` 处理,新增 `START_SPEAKING` 和 `STOP_SPEAKING` 状态回调 - 改进了编码帧回调的参数类型,`onEncodedAudioFrameReceived`、`onEncodedVideoImageReceived`、`onEncodedVideoFrame` 现在使用 `ByteBuffer` 替代 `Byte` 数组 - **改进与优化** - VAD 插件启动优化,`enableExtension` 现在在 SDK 内部实现,应用程序不再需要手动调用此方法 - 修复了 `VideoFrame` 中 `alphaBuffer` 和 `metadataBuffer` 的处理问题 ### v4.4.30.1(2024-11-12) - **API 变更** - 增加 AgoraAudioVad2 相关 `Vad2` 接口,移除 AgoraAudioVad 相关 `Vad` 接口 - 新增接收编码音频回调接口 `IAudioEncodedFrameObserver` - **改进与优化** - 修复 `LocalAudioDetailedStats` 相关回调崩溃问题 - 修改 `onAudioVolumeIndication` 回调参数类型 ### v4.4.30(2024-10-24) - 详细更新日志请参考 [发版说明](https://doc.shengwang.cn/doc/rtc-server-sdk/java/overview/release-notes) ## 其他参考 - 详细参考官网() - 官网 API 文档 [Agora Server Java SDK API 参考](https://doc.shengwang.cn/api-ref/rtc-server-sdk/java/overview)