# 构建智能手表场景 (/zh-CN/solutions/smart-watch/get-started/quick-start)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

本文介绍如何基于声网 SDK 实现智能手表音视频对讲场景。

你需要在设备端采集音视频信号，编码并发送到客户端，同时接收并渲染客户端发送的音视频信号。

## 设备端构建 [#设备端构建]

设备端包括以下两类：

- 安装实时操作系统 (Real-time operating system, RTOS) 的设备。声网已支持展锐 T1X7、W217、W3X7、8910，如需使用其他芯片平台，联系 sales@shengwang.cn。
- 安装 Android 操作系统的设备。

你可以根据自己的操作平台，参考以下步骤完成设备端构建。

<Tabs defaultValue="rtos" groupId="os" persist>
<TabsList>
  <TabsTrigger value="rtos">实时操作系统 (RTOS)</TabsTrigger>
  <TabsTrigger value="android">Android 操作系统</TabsTrigger>
</TabsList>

<TabsContent value="rtos">

对于实时操作系统 (RTOS)，你需要实现以下功能：

### 采集并编码音视频信号 [#采集并编码音视频信号]

你需要使用与设备适配的原生库实现音视频信号采集与编码。

### 将已编码的音视频信号发送到客户端 [#将已编码的音视频信号发送到客户端]

你需要在设备端集成 [RTSA Lite SDK](/zh-CN/realtime-media/rtsa/reference/downloads)，将音视频帧发送到客户端。

设备端调用 RTSA Lite SDK 中的 `agora_rtc_join_channel` 加入 RTC 频道。收到 `on_join_channel_success` 回调后，就可以开始发送音视频数据。下面的示例代码展示了设备端 RTSA Lite SDK 的调用逻辑。设备端与客户端必须使用同一个[声网 App ID](../build/setup-and-access/enable-service#获取-app-id) 且加入同一个 RTC 频道才能互通。

```c
// 示例代码基于 1.8.0 版本的 RTSA Lite SDK
// 加入 RTC 频道，需要使用业务后台下发的参数
rval = agora_rtc_join_channel(g_conn_id, CHANNEL_NAME, CALLEE_UID, TOKEN, &channel_options);
if (rval < 0) {
    printf("Failed to join channel \"%s\", reason: %s\n", CHANNEL_NAME, agora_rtc_err_2_str(rval));
    return -1;
}

// 收到 on_join_channel_success 回调后，启动音视频发送线程
static bool g_connected_flag = false;

static void __on_join_channel_success(connection_id_t conn_id, uint32_t uid, int elapsed) {
    g_connected_flag = true;
    agora_rtc_get_connection_info(conn_id, &g_conn_info);
    printf("[conn-%u] Join the channel %s successfully, uid %u elapsed %d ms\n", conn_id, g_conn_info.channel_name, uid, elapsed);
}

while (!g_connected_flag) {
    usleep(100 * 1000);
}

pthread_t video_thread_id;
pthread_t audio_thread_id;

rval = pthread_create(&video_thread_id, NULL, video_send_thread, 0);
if (rval < 0) {
    printf("Unable to create video push thread\n");
    return -1;
}

rval = pthread_create(&audio_thread_id, NULL, audio_send_thread, 0);
if (rval < 0) {
    printf("Unable to create audio push thread\n");
    return -1;
}

pthread_join(video_thread_id, NULL);
pthread_join(audio_thread_id, NULL);
```

### 接收并渲染客户端发送的音视频信号 [#接收并渲染客户端发送的音视频信号]

你需要在设备端集成 [RTSA Lite SDK](/zh-CN/realtime-media/rtsa/reference/downloads)，接收客户端发送的音视频帧。

- 监听 `on_audio_data` 回调接收所有你已加入的频道内的音频数据流。
- 监听 `on_video_data` 回调接收所有你已加入的频道内的视频数据流。

```c
static void __on_audio_data(connection_id_t conn_id, const uint32_t uid, uint16_t sent_ts, const void *data, size_t len, const audio_frame_info_t *info_ptr) {}

static void __on_video_data(connection_id_t conn_id, const uint32_t uid, uint16_t sent_ts, const void *data, size_t len, const video_frame_info_t *info_ptr) {}
```

接收到音视频帧后，你需要使用与设备适配的原生库实现音视频帧的渲染。

</TabsContent>

<TabsContent value="android">

你需要在 Android 设备端集成 [RTC SDK](/zh-CN/realtime-media/rtc/reference/downloads)，直接实现音视频采集、编码、传输、解码、渲染等功能。详见[实现音视频互动](/zh-CN/realtime-media/rtc/get-started/quick-start)。

</TabsContent>
</Tabs>

## 客户端构建 [#客户端构建]

客户端可以是 Android、iOS 等移动端设备或 macOS、Windows 等桌面端设备。

你需要在客户端集成 [RTC SDK](/zh-CN/realtime-media/rtc/reference/downloads)，直接实现音视频采集、编码、传输、解码、渲染等功能。详见[实现音视频互动](/zh-CN/realtime-media/rtc/get-started/quick-start)。

在传输指定格式的音视频数据时，RTSA Lite SDK 与 RTC SDK 可以实现互通。详见[与 RTC SDK 互通音视频数据](/zh-CN/realtime-media/rtsa/build/rtc-interoperability/interoperate-rtc)。
