Linux SDK
更新时间:2026-04-02
互动大模型 Linux SDK
目录
前提条件
1. 百度智能云账号配置
在使用本SDK前,需要在百度智能云完成以下配置:
| 配置项 | 获取地址 | 说明 |
|---|---|---|
| APPID | 互动大模型应用ID | 互动大模型的应用标识 |
| AK | AK/SK管理 | 访问密钥ID |
| SK | AK/SK管理 | 访问密钥密钥 |
| LICKEY | 资源管理 | 许可证密钥,需绑定APPID |
2. 硬件要求
- ARM64/ARMv7/x86_64 Linux设备
- 音频设备 (支持ALSA)
- 摄像头 (支持V4L2,可选)
3. 依赖库
- libtinyalsa (音频采集播放)
- libjpeg-turbo (JPEG编解码)
配置说明
在 chat.cpp 中配置以下参数:
C++
1// 应用标识 (必填)
2#define APPID "XXXX"
3
4// 访问密钥 (必填)
5#define AK ""
6#define SK ""
7
8// 许可证密钥 (必填)
9#define LICKEY "XXXXX"
10
11// 设备ID (可选,用于license验证)
12#define DEVICE_ID "DEVID-2026-YYYYYY"
13
14// 应用版本
15#define APP_VERSION "V1.0.2"
Agent平台配置
C++
1// AI Agent服务端地址
2#define AGENT_PLATFROM_ENDPOINT "http://ai.agent.kaywang.cn:8988/kk/v1/aiagent"
静音检测配置
C++
1#define ENERGY_THRESHOLD 10000.0f // 静音检测能量阈值
2#define LOW_ENERGY_FRAMES 10 // 连续静音帧数阈值
核心API
1. SDK初始化与销毁
创建RTC客户端
C++
1typedef baidurtc::BaiduRtcRoomClient* f_createBaiduRtcRoomClient();
2
3// 使用示例
4void* handle = dlopen("libbaidurtc.so", RTLD_LAZY | RTLD_DEEPBIND);
5f_createBaiduRtcRoomClient* createClient = (f_createBaiduRtcRoomClient*)dlsym(handle, "_ZN8baidurtc24createBaiduRtcRoomClientEv");
6baidurtc::BaiduRtcRoomClient* g_BrtcClient = createClient();
获取SDK版本
C++
1extern "C" const char* getBaiduRtcSdkVersion();
2
3// 使用示例
4f_getVersion* version = (f_getVersion*)dlsym(handle, "getBaiduRtcSdkVersion");
5printf("BRTC SDK Version is: %s\n", version());
启用/禁用日志
C++
1BAIDU_RTC_EXPORT_API void enableBaiduRtcLog(bool isEnable);
2
3// 使用示例
4f_enable* enableLog = (f_enable*)dlsym(handle, "enableBaiduRtcLog");
5if (enableLog) {
6 enableLog(0); // 0 = 禁用日志,非0 = 启用日志
7}
销毁客户端
C++
1virtual void Destory() = 0;
2
3// 使用示例
4g_BrtcClient->Destory();
5g_BrtcClient = nullptr;
2. 参数配置
设置AppID
C++
1virtual void setAppID(const char *AppID) = 0;
2
3// 参数说明
4// AppID: 百度云RTC申请的AppID
5
6// 使用示例
7g_BrtcClient->setAppID(APPID);
8
9#### 设置SSL证书
10```cpp
11virtual void setCER(const char *cerFile) = 0;
12
13// 参数说明
14// cerFile: SSL证书文件路径 (随SDK提供)
15
16// 使用示例
17g_BrtcClient->setCER("./a.cer");
设置音视频参数
C++
1virtual void setParamSettings(RtcParameterSettings* paramSettings,
2 RtcParameterSettings::RtcParamSettingType paramType) = 0;
3
4// RtcParameterSettings 结构说明
5struct RtcParameterSettings {
6 bool HasVideo; // 是否启用视频
7 bool HasAudio; // 是否启用音频
8 bool HasData; // 是否启用数据通道
9 int AudioINChannel; // 输入音频通道数 (1=单声道, 2=立体声)
10 int AudioINFrequency; // 输入音频采样率 (如16000, 48000)
11 bool AsPublisher; // 是否作为发布者
12 bool AsListener; // 是否作为订阅者
13 bool AutoPublish; // 是否自动发布
14 // ... 其他音视频参数
15};
16
17// 使用示例
18RtcParameterSettings s;
19s.HasData = true;
20s.HasVideo = false;
21s.HasAudio = true;
22s.AudioINChannel = 1;
23s.AudioINFrequency = 16000;
24s.AsPublisher = true;
25s.AsListener = true;
26s.AutoPublish = true;
27
28g_BrtcClient->setParamSettings(&s, s.RTC_PARAM_SETTINGS_ALL);
3. 房间管理
登录房间
C++
1virtual bool loginRoom(const char* roomName, const char* userId,
2 const char* displayName, const char* token) = 0;
3
4// 参数说明
5// roomName: 房间名 (Agent场景下使用agent ID)
6// userId: 用户ID (64位数字字符串)
7// displayName: 显示名称
8// token: 认证令牌
9
10// 返回值: true=成功, false=失败
11
12// 使用示例
13std::string uid = "202600000" + std::to_string(rand()/100000);
14std::string token = "token";
15g_BrtcClient->loginRoom("2131", uid.c_str(), "BRTC.EAI chat demo", token.c_str());
登出房间
C++
1virtual bool logoutRoom() = 0;
2
3// 使用示例
4g_BrtcClient->logoutRoom();
4. 媒体发送
发送音频数据
C++
1virtual void sendAudio(const char *data, int len) = 0;
2
3// 参数说明
4// data: PCM音频数据地址
5// len: 数据长度 (字节)
6
7// 使用示例 (从ALSA采集音频并发送)
8char buffer[4096];
9// ... 从pcm设备读取音频数据 ...
10g_BrtcClient->sendAudio(buffer, bytes_read);
发送图像数据
C++
1virtual void sendImage(const char *data, int len) = 0;
2
3// 参数说明
4// data: 图像数据地址 (支持JPEG, H264, YUV格式)
5// len: 数据长度
6
7// 使用示例
8g_BrtcClient->sendImage(jpeg_data, jpeg_size);
发送数据/消息
C++
1virtual void sendData(const char *data, int len) = 0;
2
3// 参数说明
4// data: 文本/二进制数据
5// len: 数据长度
6
7// 使用示例 - 发送文本消息
8g_BrtcClient->sendData("Hello", 5);
9
10// 使用示例 - 发送自定义消息
11g_BrtcClient->sendMessageToUser("[T]:Hello.", "0");
发送消息给指定用户
C++
1virtual void sendMessageToUser(const char *msg, const char * id) = 0;
2
3// 参数说明
4// msg: 消息内容
5// id: 用户ID ("0"表示广播)
6
7// 使用示例
8g_BrtcClient->sendMessageToUser("[T]:Hello.", "0"); // 广播
9g_BrtcClient->sendMessageToUser("[T]:Hi.", "12345"); // 发送给指定用户
5. 推流控制
开始推流
C++
1virtual void startPublish() = 0;
停止推流
C++
1virtual void stopPublish() = 0;
开始订阅流
C++
1virtual void subscribeStreaming(const char * feedId, IAudioFrameObserver *afo,
2 IVideoFrameObserver *vfo, IDataFrameObserver *dfo) = 0;
3
4// 参数说明
5// feedId: 要订阅的流ID
6// afo: 音频回调 (可为空)
7// vfo: 视频回调 (可为空)
8// dfo: 数据回调 (可为空)
停止订阅流
C++
1virtual void stopSubscribeStreaming(const char * feedId) = 0;
6. 用户管理
设置用户属性
C++
1virtual void setUserAttribute(const char * a) = 0;
获取用户属性
C++
1virtual void getUserAttribute(const char * id) = 0;
禁言/解除禁言
C++
1virtual void shutupUser(const char * userId, bool shutup) = 0;
2// shutup: true=禁言, false=解除禁言
踢出用户
C++
1virtual void kickoutUser(const char * userId) = 0;
解散房间
C++
1virtual void disbandRoom() = 0;
8. 网络与状态
获取房间状态
C++
1virtual void getRoomStates(RtcRoomUserInfo** userInfoList, int& userNumber) = 0;
获取连接统计
C++
1virtual ConnectionStats getConnectionStats(ConnectionType connectionType) = 0;
设置候选IP (UDP代理)
C++
1virtual void setCandidateIP(const char *candidateIP) = 0;
设置媒体服务器IP
C++
1virtual void setMediaServerIP(const char *mediaserverIP) = 0;
8. 编码器配置
设置视频编码器
C++
1virtual void setVideoCodec(const char * vc) = 0;
2// 可选值: "h264", "vp8", "vp9", "h263", "av1", "h265", "h266"
3// 默认: "h264"
设置音频编码器
C++
1virtual void setAudioCodec(const char * ac) = 0;
2// 可选值: "opus", "pcmu", "pcma"
3// 默认: "opus"
设置OPUS音频选项
C++
1virtual void setAudioOpusCeltOnly(int celtOnly) = 0; // 只使用CELT编码
2virtual void setAudioOpusPtime(int ptime) = 0; // 设置包时间大小
回调接口
1. 消息监听器 IRtcMessageListener
C++
1class IRtcMessageListener {
2public:
3 virtual void OnRtcMessage(RtcMessage &msg) = 0;
4};
5
6// RtcMessage 结构
7struct RtcMessage {
8 RtcMessageType msgType; // 消息类型
9 int64_t feedId; // 用户ID
10 char extra_info[1024]; // 附加信息
11 // ...
12};
13
14// 注册方式
15g_BrtcClient->registerRtcMessageListener(&myListener);
2. 音频帧回调 IAudioFrameObserver
C++
1class IAudioFrameObserver {
2public:
3 virtual void onAudioData(int64_t feedid, const char *audio, int len,
4 int samlplerate, int channels) = 0;
5};
6
7// 注册方式
8IAudioFrameObserver* iAfo[1];
9iAfo[0] = &myListener;
10g_BrtcClient->registerAudioFrameObserver(iAfo, 1);
3. 视频帧回调 IVideoFrameObserver
C++
1class IVideoFrameObserver {
2public:
3 virtual void onFrame(int64_t feedid, const char *img, int len,
4 RtcImageType imgtype, int width, int height) = 0;
5};
6
7// 注册方式
8IVideoFrameObserver* iVfo[1];
9iVfo[0] = &myListener;
10g_BrtcClient->registerVideoFrameObserver(iVfo, 1);
4. 数据帧回调 IDataFrameObserver
C++
1class IDataFrameObserver {
2public:
3 virtual void onTextData(int64_t feedid, const char *data, int len) = 0;
4};
5
6// 注册方式
7IDataFrameObserver* iDfo[1];
8iDfo[0] = &myListener;
9g_BrtcClient->registerDataFrameObserver(iDfo, 1);
消息类型
| 类型 | 值 | 说明 |
|---|---|---|
| RTC_ROOM_EVENT_ON_USER_MESSAGE | - | 收到用户消息 |
| RTC_MESSAGE_ROOM_EVENT_REMOTE_COMING | - | 远端用户加入 |
| RTC_MESSAGE_ROOM_EVENT_REMOTE_LEAVING | - | 远端用户离开 |
| RTC_MESSAGE_STATE_STREAM_UP | - | 流上线/可推送 |
E消息协议
SDK支持自定义E消息协议,用于与Agent进行交互。
1. License激活
C++
1// 请求: [E]:[LIC]:[MUST]:
2// 响应: [E]:[LIC]:[ACTIVE]:{"devId":"xxx","uId":"xxx","licKey":"xxx"}
2. 播放音频
C++
1// 消息: [E]:[PLAY_AUDIO]:{URL}
3. 告警消息
C++
1// 消息: [E]:[ALARM]:{"text":"告警内容"}
4. 媒体生成结果
C++
1// 消息: [E]:[MEDIA_GENERATE_RESULT]:{"msg":"success","type":"image","data":[...]}
5. TTS状态事件
C++
1// TTS开始: [E]:[TTS_BEGIN_SPEAKING]
2// TTS结束: [E]:[TTS_END_SPEAKING]
6. 远端播放状态
C++
1// 开始播放: [E]:[REMOTE_PLAYER_BEGIN]
2// 结束播放: [E]:[REMOTE_PLAYER_END]
7. 图片上传事件
C++
1// 请求上传: [E]:[UPLOAD_IMAGE]
2// 设备端收到后应拍照并上传
数据发送协议
文件/二进制数据发送格式
第一个包 (带文件头):
Plain Text
1字节0: 0x18
2后续: [T]=binary;[N]=filename\n
3然后是数据
后续包:
Plain Text
1字节0: 0x10
2后续是数据
结束标志:
Plain Text
1字节0: 0x14
代码示例
C++
1#define CHUNK_SIZE 16384 * 4
2
3void sendFile(const char *filename, const char *gImgForMode)
4{
5 FILE *fp = fopen(filename, "rb");
6 // ... 读取文件 ...
7
8 uint8_t chunk[CHUNK_SIZE];
9 size_t offset = 0;
10
11 while (读取数据成功) {
12 char hdr[512];
13 size_t hdr_len = 0;
14
15 if (offset == 0) {
16 // 第一个包 - 带文件头
17 snprintf(hdr, sizeof(hdr),
18 "\x18[T]=binary;[N]=%s%s\n",
19 filename, gImgForMode ? gImgForMode : "");
20 hdr_len = strlen(hdr);
21 } else {
22 // 后续包
23 hdr[0] = 0x10;
24 hdr_len = 1;
25 }
26
27 // 发送数据
28 g_BrtcClient->sendData(hdr, hdr_len);
29 g_BrtcClient->sendData(chunk, read_len);
30
31 offset += read_len;
32 }
33
34 // 发送结束标志
35 uint8_t end = 0x14;
36 g_BrtcClient->sendData((const char*)&end, 1);
37}
编译运行
编译
Bash
1make
运行 (x86_64)
Bash
1cd bin
2LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./chat
运行 (ARM设备)
Bash
1# 将 bin 和 lib 目录拷贝到设备
2# 修改 chat.cpp 中的配置后重新编译
3cd bin
4LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./chat
交互菜单
运行时可选择以下操作:
6: 发送文本消息7: 切换语音场景8: 发送图片文件9: 拍照并发送q: 退出
常见问题
1. 音频采集
- 检查/dev/snd/设备权限
- 确认PCM配置参数正确
2. 视频采集
- 确保V4L2驱动正常加载
- 使用v4l2-ctl工具测试摄像头
3. 网络连接
- 检查SSL证书路径是否正确
- 确认防火墙配置允许WebSocket连接
4. License问题
- 确认LICKEY已绑定到APPID
- 检查设备时间是否正确
评价此篇文章
