设备端实现 (Linux)
更新时间不可用
了解如何通过平行操控 SDK 实现 Linux 设备端,包括配置步骤、实现要点和注意事项。
声网平行操控 SDK 支持主流的 Linux、Android 设备端平台,Windows、Web、Linux、Android、iOS、macOS 操控端平台。
本文介绍如何通过声网平行操控 SDK 在 Linux 设备端实现主要功能。
信息
如需体验 Android 设备端,请联系 sales@shengwang.cn。
技术原理
基于如下技术框架图,你可以结合你的实际业务进行开发。
前提条件
开始前,请确保满足如下条件:
- 准备平行操控所需的 Linux 开发环境。详见准备开发环境。
- 联系 sales@shengwang.cn 获取平行操控 Linux SDK。
- 初始化 SDK 并与声网 RTC 频道建立连接。详见准备工作。
实现流程
采集并发送音视频流
按照如下步骤实现从设备端采集并发送音视频流的逻辑:
-
创建
YuvCapturer对象。C++ static resolution s; static YuvCapturer capturer(s); static Buffer b; -
设置摄像头参数并初始化摄像头采集。具体步骤如下:
- 初始化前,调用
set_resolution和set_fps设置摄像头采集的分辨率和帧率,调用set_device指定用于采集视频流的摄像头设备。 - 完成参数设置和设备指定后,调用
init初始化摄像头采集。 - 初始化后,调用
camera_capture_start开始通过摄像头采集 YUV 格式的视频帧。
C++ // 设置分辨率,默认值为 640 × 480 capturer.set_resolution(options.video.width, options.video.height); // 设置帧率,默认值为 30 capturer.set_fps(options.video.frameRate); // 指定采集视频流的摄像头,默认值为 /dev/video0 capturer.set_device(options.video.device_name); // 初始化摄像头采集 capturer.init(); // 开始摄像头采集 capturer.camera_capture_start(); - 初始化前,调用
-
开始摄像头采集后,调用
get_one_frame从摄像头获取 YUV 格式的视频帧,成功调用后获取到的视频帧会存储到设备内存中。C++ capturer.get_one_frame(); -
发送采集的视频数据。
从摄像头采集到视频数据后,调用
sendVideoFrame发送 YUV 格式的原始视频数据,或调用sendEncodedVideoImage发送自编码后的 H.264 格式视频数据,详细步骤可以参考向操控端发送媒体流。C++ // 发送 YUV 格式的原始视频数据 videoFrameSender->sendVideoFrame(videoFrame); // 发送编码后的 H.264 格式的视频数据 videoH264FrameSender->sendEncodedVideoImage( reinterpret_cast<uint8_t*>(h264Frame.get()->buffer.get()), h264Frame.get()->bufferLen, videoEncodedFrameInfo); -
发送 YUV 格式视频帧后,尽早调用
clear_one_frame从内存中清除获取的视频帧。成功释放设备内存后,才能继续调用get_one_frame获取下一个视频帧。示例代码如下:C++ capturer.clear_one_frame();
收发控制信令
按照如下步骤实现从设备端收发控制信令的逻辑:
-
创建并初始化
RtmClient对象,并设置事件监听。C++ auto service = createAndInitAgoraService(false, true, true, true, false, options.appId.c_str()); auto con = service->createRtcConnection(agora::rtc::RtcConnectionConfiguration()); // 使用新的流订阅模式 auto p = con->getAgoraParameter(); p->setBool("rtc.vos_aut_use_old_sync",false); // 创建 RtmClient auto rtm_client = agora::rtm::createAgoraRtmClient(); rtmHandler handle; // 配置 RtmClient agora::rtm::RtmConfig config; // 设置事件监听程序 config.eventHandler = &handle; config.appId = options.appId.c_str(); // userId 中仅支持传入内容为数值的字符串,例如 "1234567" config.userId = options.userId.c_str(); // 初始化 RtmClient rtm_client->initialize(config); -
创建 Stream Channel 并加入频道。在使用
StreamChannel类中的任何 API 之前,你需要先调用createStreamChannel创建 Stream Channel。C++ // 创建 Stream Channel auto stream_channel = rtm_client->createStreamChannel(options.channelId.c_str()); agora::rtm::JoinChannelOptions opt; opt.token = options.appId.c_str(); // 加入频道 stream_channel->join(opt); -
加入频道中的 Topic 并发布消息。成功加入 Topic 后,SDK 会自动将你注册为该 Topic 的消息发布者,你可以在该 Topic 中发送消息。成功发送后,SDK 会把该消息分发给该 Topic 的所有订阅者。
C++ agora::rtm::JoinTopicOptions topic_join_opt; // 加入 Topic stream_channel->joinTopic(options.topic.c_str(), topic_join_opt); // 在 Topic 中发布消息 stream_channel->publishTopicMessage(options.topic.c_str(), "hellortm", 9); -
订阅 Topic 及 Topic 中的消息发送者。
C++ agora::rtm::TopicOptions topic_opt; const char *users[] = { options.remoteUserId.c_str() }; topic_opt.users = users; topic_opt.userCount = 1; stream_channel->subscribeTopic(options.topic.c_str(), topic_opt); -
通过
onMessageEvent事件通知接收远端用户的消息。C++ // 继承 IRtmEventHandler 类 class rtmHandler : public agora::rtm::IRtmEventHandler { public: // 监听消息事件通知 void onMessageEvent(MessageEvent &event) override { if(_stream_channel){ int r = _stream_channel->publishTopicMessage(_topic.c_str(), event.message, 12); printf("send %d rrr \n",r); } // 获取系统时间 get_stime(); // 打印消息发送和接收的时间戳 printf("send ts: %s, receive ts: %s \n", event.message, timestr); } agora::rtm::IStreamChannel* _stream_channel = nullptr; std::string _topic; }; -
退出并释放资源。
C++ stream_channel->leaveTopic(options.topic.c_str()); // 退出 Topic stream_channel->leave(); // 退出频道 stream_channel->release(); // 销毁 Stream Channel rtm_client->release(); // 销毁 RtmClient
参考信息
示例项目
声网在 SDK 包中提供了以下示例项目供你参考:
├── agora_sdk # 声网的 SDK 库文件和头文件
└── example # 示例代码
├── capture_yuv
│ └── sample_send_capture_yuv.cpp # 采集并发送音视频流
└── rtm
├── receive_rtm_message.cpp # 接收控制信令
└── send_rtm_message.cpp # 发送控制信令API 参考
你可以参考以下 API 文档: