(原创声明)
- 表 1 开发环境及服务节点清单说明
云端:Centos 7.9 | 任务线(推流 + 流管理 + 交互连接管理) |
---|---|
stream_pusher_with_rtsp | 抓取云端桌面 + 编码推流至rtsp_server. |
rtsp_server | 依循rtsp协议负责流分发管理。曾经尝试采用Nginx代理方式,但在该场景下测试rtsp_server时延更占优势。 |
cgi_server | 基于socket、epoll、进程池实现高并发处理,以及与多客户端之间的操作指令交互与消息通信管理。 |
本地Ubuntu16.04 + Qt | 任务线(拉流 + 交互) |
stream_player_with_qt | 拉取云端视频流,并解码显示;采集本地操作指令并上传云端实现交互。 |
- 图 2 本方案各服务节点框架示意图
本方案最终实现效果:
- 表2 客户端时延数据随机测试统计(约为70~100ms)
整体方案设计说明
(1)云端·推流端设计
- 图 3 推流端中抓屏输入端与输出端【初始化及参数配置】
此处承接上一模块,至此,抓屏解码输入口、编码推流输出口两者均已进入准备就绪状态。
- 图 4 推流端与流分发管理服务之间【逻辑交互细节流程】
本案至此,已完成在云上推流端的编码推流以及交互接口设计。
此时,云端的码流则将推送至云上流分发及交互管理服务端:rtsp_server
以及cgi_server
。
(2)云端·流分发及并发管理端设计
本节所述的设计内容,将负责本方案中的云上流分发以及与本地客户端之间的连接及交互管理cgi_server
。
另外,在云服务器上同时运行了一路rtsp_server
中转服务。
- 图 5 云上流分发及并发管理端设计细节流程
该服务中维护了一组进程池,在父子进程中各自分别维护了一组内核事件表。当有新的拉流请求到来时,主进程将通过典型的轮流选取算法来主动选择某一子进程来为之服务。当选好子进程之后,子进程中找到与父进程之间预先建立好的管道,并通过该管道来实现两者之间的通信。
(3)本地·拉流解码显示及指令交互管理端设计
当根据rtsp协议建立起拉流连接后,循环捕捉码流,并【解码】后触发QT信号通知UI界面作实时更新显示。
- 图 6 客户端设计细节流程
(4)最终方案效果展示