本文介绍如何基于声网 SDK 实现智能手表音视频对讲的场景。你需要在设备端采集音视频信号,编码并发送到应用端,同时接收并渲染应用端发送的音视频信号。
设备端包括以下两类:
参考以下内容完成设备端构建。
对于实时操作系统(RTOS),你需要实现以下功能:
采集并编码音视频信号
你需要使用与设备适配的原生库实现音视频信号采集与编码。
将已编码的音视频信号发送到应用端
你需要在设备端集成 RTSA Lite SDK,将音视频帧发送到应用端。
设备端调用 RTSA Lite SDK 中的 agora_rtc_join_channel
加入 RTC 频道。收到 on_join_channel_success
回调后,就可以开始发送音视频数据。下面的示例代码展示了设备端 RTSA Lite SDK 的调用逻辑。设备端与客户端必须使用同一个声网 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,接收应用端发送的音视频帧。
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)
{
}
你需要使用与设备适配的原生库实现音视频帧的渲染。
你需要在 Android 设备端集成 RTC 4.x SDK,直接实现音视频采集、编码、传输、解码、渲染等功能。详见 实现视频直播。
客户端可以是 Android、iOS 等移动端设备或 macOS、Windows 等桌面端设备。
你需要在客户端集成 RTC 4.x SDK,直接实现音视频采集、编码、传输、解码、渲染等功能。详见 实现视频直播。
声网 RTC SDK 与 RTSA Lite SDK 之间的视频互通支持情况如下:
你需要一些额外操作确保声网 RTC SDK 可以正常接收 RTSA Lite SDK 发送的视频。
小程序端
如果你在设备端使用 JPEG 编码格式,且接收端使用了 RTC 小程序 SDK,则需要指定小程序声网网关才能正确接收视频,具体网关地址配置联系 sales@agora.io。
声网 RTC SDK 与 RTSA Lite SDK 之间的音频互通支持情况如下:
首先,你需要开启 SDK 内置的编解码器。其次,你还需要一些额外操作确保声网 RTC SDK 可以正常接收 RTSA Lite SDK 发送的音频。
移动端和桌面端
RTC 移动端和桌面端 SDK(Android、iOS 等) 需要通过 setParameters
方法指定设备端用的音频 codec。你需要联系 sales@agora.io 获取相应参数。
小程序端
如果你在设备端没有使用 PCM 格式或 Opus 编码格式,且接收端使用了 RTC 小程序 SDK,则需要指定小程序声网网关才能正确接收音频,具体网关地址配置联系 sales@agora.io。
Web 浏览器端
如果你在设备端没有使用 PCM 格式或 Opus 编码格式,且接收端使用了 RTC Web SDK,则需要在调用 AgoraRTC.createClient
时设置 codec。 RTC Web SDK 必须是 4.9.0 或更高版本。
AgoraRTC.createClient({mode: "live", codec: "h264", audioCodec: "pcma"})
AgoraRTC.createClient({mode: "live", codec: "h264", audioCodec: "pcmu"})
AgoraRTC.createClient({mode: "live", codec: "h264", audioCodec: "g722"})
如果你在设备端使用了 PCM 格式或 Opus 编码格式,则无需在调用 AgoraRTC.createClient
时设置 codec。