网易云信4K 8K RTC助力远程医疗的技术实践
//
编者按:随着近年来国家关于缓解医疗资源分配不均的一系列政策出台,远程医疗作为平衡医疗资源分配的有力手段,目前正处于强劲发展阶段。网易云信运用超高清RTC视频技术助力医疗行业实现了远程高清视频病理分析和手术示教等能力。LiveVideoStackCon 2023 上海站邀请了来自网易云信的朱明亮,为大家分享网易云信关于4K、8K RTC助力远程医疗的技术实践 。
文/朱明亮
整理/LiveVideoStack
大家好,我本次分享的主题是云信8K RTC助力远程医疗的技术实践。
首先向大家做一个自我介绍,本人来自网易云信,负责RTC SDK端视频引擎工程团队,主攻的业务方向是视频管线的需求实现和性能优化。历经点播、直播到现在的RTC,我在音视频领域已有十余年工作经验,目前在云信致力于4K、8K RTC技术的研发。

本次分享将分为以下四部分,一是介绍业务背景,二是我们的远程医疗方案,三是8K RTC实践,最后进行总结展望。
-01-
背景介绍

下面将从三个方面介绍我们的业务背景。
首先是医疗资源现状,我国的医疗资源目前高度紧缺且分布极度不均,主要体现为:近85%的资源集中在大中城市的少数二、三甲医院;全国医疗结构的近95%为基层卫生机构,而基层高水平医疗人员数量较少,取得正高/副高资格的医生占比仅为 5.1%。
为了解决资源不均的问题,国家目前正大力推行建立分级医疗和远程医疗体系。

提到远程医疗,可能大家首先想到的形式是医生通过网络远程操纵机器人完成手术,不过现状与之相比还有一定差距。当下远程医疗更多作为线下实体医院的功能延伸,如通过网络实现患者预约、就医挂号和病例查询等功能。至近期已逐步发展到“互联网+医疗”模式,患者可以利用网络进行图文、视频直播问诊并开单拿药。
我们认为远程医疗未来的发展趋势是实现高清视频问诊,包括多学科会诊(MDT)、手术高清视频示教和视频会议等。今天主要将介绍我们在这方面进行的实践。

我们再来了解8K的概念,与当前RTC常用的FHD 1080P和影院、音视频点播成熟化应用的4K分辨率相比,8K超高清分辨率达到了4K的4倍,1080P的16倍。它包括更丰富、更细腻的画面细节,传达的信息量是人眼可识别范围的4.3倍,即使对画面的个别位置进行放大也几乎不会出现细节损失,这更有利于远程医疗病理分析和远程传输等方面的应用。
-02-
远程医疗方案

接下来介绍我们现阶段在远程医疗方面应用的一些方案。上图为网易云信互联网医院的架构图,左侧为传统互联网医院就医的闭环流程。中间为本次主要介绍的基于云信RTC SDK打造的智慧协同医疗教学功能模块,它包含远程病理、远程SDT会诊、远程培训和会议等能力。
对于症状轻微的普通疾病通过左侧闭环流程即可完成就医,而对于在基层医疗机构难以决策的疑难杂症、危重疾病、手术等,则可通过智慧协同功能模块与其他医院、其他科室的专家进行会诊。

云信RTC的SDK架构如上所示,它的分层较为清晰。首先最底层为基础层,在此之上为核心的媒体引擎层,包括视频引擎、音频引擎和传输引擎模块。接着是跨平台封装层,该层会抽象一些跨平台API,包括信令传输等模块,我们在该层还会构建一些通用的音视频逻辑,如视频主辅流双通道分流、主流Simulcast机制等。再上一层为SDK接口层,针对各个平台不同的Native language进行API封装,并提供给客户进行集成。顶层为我们推出的云信易用体系,可以提供 Sample Code、行业解决方案Demo和通用组件,便于客户进行集成。

云信RTC SDK的视频引擎Pipeline如上所示。顶部为网络传输模块,左侧为视频上行流程,历经视频源采集、前处理至编码、上传,支持主辅流双路通道。VQC模块会通过QoS评估网络带宽动态调整编码器参数。
右侧为视频下行流程,支持N路下行,可满足多人视频会议等场景的需求。

接下来具体介绍视频引擎的上行Pipeline,其中左侧的视频采集模块支持桌面采集、摄像头采集和第三方输入等方式,输入的视频经过前处理将分为两路,一路经过叠加水印、打码等额外处理后进行本地渲染以供预览。另一路将经过额外处理传输至编码器。VQC模块会根据网络条件动态调整视频分辨率、码率、帧率等编码参数,提高观看体验。
-03-
8K RTC实践

下面将从以上几方面介绍我们关于8K RTC的技术实践。

我们的8K RTC系统在选定的一般硬件平台落地。CPU是Intel 11 代i5,显卡是 集成显卡 iRIS Xe Graphics,系统是 Windows11,显示设备为8K显示屏,使用8K 摄像头进行采集。

8K RTC 对视频引擎Pipeline的优化点主要集中在屏幕共享、摄像头采集、前处理、编码和VQC五大方面。

首先介绍8K摄像头采集方案。由于USB3.0摄像头存在450 MB/s的传输速率上限,而8K原始YUV 420P码流每帧的数据量达到了47 M字节,照此估算视频帧率只能达到7~8fps,流畅度显然不能满足要求。目前我们采用的方案为从8K摄像头采集8K H.265或MJPEG压缩码流,视频规格为20Mbps@20fps。
从摄像头采集的数据在解码后将按照正常的上行Pipeline处理,下行端解码器会接收8K H.265码流进行解码。1V1 会议场景下,主播端会同时存在两路 8K 解码、一路 8K 编码,这对系统造成的压力较大。

我们对上述问题进行了优化,改为向网络端直接发送摄像头采集的码流,此时摄像头既是视频源又是编码器,避免了反复编解码。但这对摄像头的硬件要求较高,需摄像头具备稳高质量的编码能力,并要保证摄像头编码器能够接收VQC模块的指令,调整编码参数。
因此我们使用Dshow在采集模块中加入了摄像头指令控制模块,基于Windows UVC Driver增加了可查询Control接口的Extension Unit,使采集模块能通过Extension Unit动态调整编码参数。同时我们还增加了IDR请求能力,使中途加入会议的用户能够快速接收I帧,显示画面。

针对8K桌面采集我们目前采用高效率的DXGI方案,在指定硬件平台可实现8K 30fps视频采集,其他流程与基本的视频引擎Pipeline一致。

接下来介绍我们针对8K桌面采集的优化。DXGI是微软推出的基于硬件驱动层的图形操作接口,可以支持不同图形库间的互操作。右侧为大致的采集流程,在创建D3DDevice后,利用IDXGIOutputDuplication接口的AcquireNextFrame函数获取屏幕画面,将Texture转为RGBA数据,再使用Libyuv 把 RGBA 转为 I420,并将其发送至编码器。
我们对红框圈出的两个环节进行了优化,第一是在调用AcquireNextFrame函数时注意延时参数控制,避免因时延过低导致出现大量重复帧,或是时延过高导致画面帧数不足。
第二是在RGBA数据转换时,由于8K RGBA数据量很大,直接将RGBA数据复制到前处理线程耗费的时间过长,因此我们进行了多线程优化,后续又发现使用Libyuv 直接将 RGBA 转到 I420 所需的时间更短,便改为采用这种方式。

接下来介绍视频编解码方面的优化,首先对于落地的硬件平台而言,8K软编软解是不可能的,需要考虑硬编硬解。其次在质量方面,H.264已经不能胜任4K/8K视频的编码,因此编码器改为使用H.265。最后是延时,由于8K编码对系统性能和延时的压力很大,因此要尽可能优化前处理流程,去掉不必要的环节,从而降低延时。

接下来介绍关于Windows端硬编硬解的优化,我们的SDK支持Nvidia、Intel和AMD三大厂商的硬件平台,最下层为基于不同平台抽象的硬编解码器,在此之上为BitrateAdjuster和BitstreamAdapter,用于动态平滑码率发送和过滤码率中额外的NALU。在引擎层会抽象不同的硬编解码器供SDK使用。

接下里介绍针对网络模块的优化。由于8K编解码的画质和码率都较高,很多传统针对1080P RTC码流的优化策略不再适用。
因此在拥塞控制方面我们采用自适应灵敏度来提升优质传输率;对于抗丢包优先使用ARQ,尽量减少使用FEC,防止恶性拥塞;在端到端时延的优化上采用高精度JitterBuffer控制,综合平衡抗性和时延。右图为优化效果的前后对比图,可以看到时延和卡顿率进一步降低,抗性和带宽利用率得到了提升。

接下来介绍针对VQC模块的优化策略。VQC是视频引擎的质量控制模块,用于平衡RTC系统视频的清晰度、流畅度和延时三个质量指标,提升视频QoE。三个指标由上图中视频编码、QoS和VQS的互相作用决定。
QoS会依据网络状况动态评估适合的码率,将其分配至VQC。VQC 会依据QoS 的反馈动态调整视频模块的编码码率,同时也可依据编码器的QP反馈和系统负载率动态调整编码分辨率/帧率。其中分辨率最低可降至640x360,8K以上分辨率的帧率最低可降至20fps。

接下来介绍关于Simulcast(大小流)的优化。考虑到网络状况和接收端的性能限制,服务端会同时发送一个大流和小流,接收端可以依据自身性能选择接收合适的视频流,服务端也可依据网络条件选择发送合适的流。我们针对小流的质量进行了优化,将小流分辨率从180p提升到360p,码率从120k提升到300k。

接下来展示云信RTC方案在客户侧的落地效果。我们与浙江一家三甲医院达成了合作,上图为院方进行MDT会诊的实景照片。可以看到,院方借助超高清RTC系统可以实现细致的远程病理切片分析。

上图展示了医院远程示教的实景效果,各地不同的医疗机构可以远程共同观看病理分析。除此之外还包括RTC方案还包括视频会议等应用场景。

上图展示了 8K 摄像头的实测采集传输数据,其中编码器采用Intel集成显卡H.265硬编码器,上行分辨率为8K。可以看到,视频实际的上行帧率为20fps左右,这基本满足医院病理分析等相对静态场景的需求。视频实际上行码率为10Mbps左右。

8K屏幕共享的实测结果与摄像头采集类似。
-04-
总结展望

接下来进行总结和展望。本次分享主要介绍了网易云信针对远程医疗提出的解决方案。8K RTC不仅是对分辨率的提升,也是对RTC视频管线的全面升级。我们在各方面进行了一些技术改进,介绍了落地过程中的技术挑战、解决方案以及最终实际的落地效果。

未来在技术优化方面,我们会进一步探索将摄像头/桌面采集的画面直接以Texture方式传输至硬编码器的方案。同时4K、8K RTC技术在云游戏、远程协作领域也有应用前景。
当前云信4K/8K RTC技术已成熟并在部分场景落地,我们将携手合作伙伴开拓更多极致高清的商业场景。我今天的分享就到这里,谢谢大家!

▲扫描图中二维码或点击“阅读原文” ▲
直通LiveVideoStackCon 2023深圳站 9折购票通道
相关文章:
网易云信4K 8K RTC助力远程医疗的技术实践
// 编者按:随着近年来国家关于缓解医疗资源分配不均的一系列政策出台,远程医疗作为平衡医疗资源分配的有力手段,目前正处于强劲发展阶段。网易云信运用超高清RTC视频技术助力医疗行业实现了远程高清视频病理分析和手术示教等能力。LiveVide…...
【排序算法】冒泡排序、插入排序、归并排序、希尔排序、选择排序、堆排序、快速排序
目录 几大排序汇总 1.冒泡排序 性能: 思路和代码: 2.插入排序 性能: 思路和代码: 3.归并排序 性能: 思路和代码: 4.希尔排序 性能: 思路和代码: 5.选择排序 性能: 思路和代码: 6.堆排序 性能: 思路和代码: topK问题 7.快速排序 性能: 思路和代码: 几大排…...
Linux学习笔记-应用层篇
1、Linux进程、线程概念/区别 Linux进程和线程是计算机系统中两种不同的资源分配和调度单位。 进程是计算机系统进行资源分配和调度的基本单位,也被认为是正在运行的程序。在面向线程的计算机结构中,进程是线程的容器。进程拥有独立的内存和系统资源&am…...
MySQL数据库的存储引擎
目录 一、存储引擎概念 二、存储引擎 2.1MyISAM 2.11MyISAM的特点 2.12MyISAM表支持3种不同的存储格式: 2.2 InnoDB 2.21InnoDB特点介绍 三、InnoDB与MyISAM 区别 四、怎么样选择存储引擎 五、查看存储引擎 六、查看表使用的存储引擎 七、修改存储引擎 …...
Linux-多路转接-epoll
epoll 接口认识epoll_createepoll_ctlepoll_wait epoll工作原理在内核中创建的数据结构epoll模型的一个完整工作流程 epoll工作模式LT-水平触发ET-边缘触发两种方式的对比 epoll的使用场景对于poll的改进惊群效应什么是惊群效应如何解决惊群效应原子操作/mutex/spinlock如何选择…...
Java面试被问了几个简单的问题,却回答的不是很好
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言 前几天参加了…...
概率论几种易混淆的形式
正态分布标准型 x − μ σ \frac{x - \mu}{\sigma} σx−μ 大数定律形式 P { X ≤ ∑ i 1 n x i − n μ n σ 2 } ∫ − ∞ X 1 2 π e − x 2 2 d x P\{X \le \frac{\sum_{i 1}^{n}x_i -n\mu}{\sqrt{n\sigma^2}} \} \int _{-\infty}^{X}\frac{1}{\sqrt{2\pi}}e^{-\fr…...
PyTorch数据增强后的结果展示
from PIL import Image import torch from torchvision import transformstrans transforms.Compose([transforms.ToTensor(), transforms.RandomErasing(p0.9, value 120, inplaceTrue)]) # 这里Compose是所做的变换img_path 02-56-45-060-1454-camra1.bmp img Image.open…...
指定程序在哪个GPU上运行
摘要: 当本地(或服务器)有个多个GPU时,需要指定程序在指定GPU上运行,需要做以下设置。 目录 一、在终端上指定GPU二、在程序中指定GPU三、系统变量指定GPU四、pytorch中指定GPU 一、在终端上指定GPU 在终端运行程序时…...
Linux CentOS7 vim多文件编辑
使用vim编辑多个文件,十分常用的操作。本文从打开、显示、切换文件到退出,进行简单讨论。 一、打开文件 1.一次打开多个文件 vim还没有启动的时候,在终端里输入vim file1 file2 … filen便可以打开所有想要打开的文件。 执行命令 vim fil…...
PAT甲级真题1153: 解码PAT准考证
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
linux信号
title: linux信号 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: SIGHUP 终止进程 终端线路挂断[喝小酒的网摘]http://blog.hehehehehe.cn/a/16999.htm SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生…...
JavaWeb开发-05-SpringBootWeb请求响应
一.请求 1.Postman 2.简单参数 package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…...
Ubuntu下载
参考文档: 镜像文件:VMware下安装ubuntu 16.04(全步骤)_vmwaubuntu-16.04.4-desktop-amd64.iso_ST0new的博客-CSDN博客 vmware tools使用安装:VMware——VMware Tools的介绍及安装方法_William.csj的博客-CSDN博客 …...
Vue 的组件加载顺序和渲染顺序
1、结论先行 组件的加载顺序是自上而下的,也就是先加载父组件,再递归地加载其所有的子组件。 而组件渲染顺序是按照深度优先遍历的方式,也就是先渲染最深层的子组件,再依次向上渲染其父组件。 2、案例 下面是一个简单的示例代…...
leetcode Top100(17)矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…...
论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)
目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的:使机械臂在非结构化环境下实现端到端的自主学习控制…...
快速安装keepalive
快速安装keepalive #安装 yum install keepalived -y# 查看版本: rpm -q -a keepalived#修改配置文件 vim /etc/keepalived.conf虚拟 ip :随意选一个,不被占用的ip即可。...
nginx实现反向代理实例
1 前言 1.1 演示内容 在服务器上访问nginx端口然后跳转到tomcat服务器 1.2 前提条件 前提条件:利用docker安装好nginx、tomcat、jdk8(tomcat运行需要jdk环境) 只演示docker安装tomcat: 默认拉取最新版tomcat docker pull t…...
使用Freemarker填充模板导出复杂Excel,其实很简单哒!
文章目录 1. 需求分析2. 对象生成3. 列表插值4. 另存xml格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析 类似这样的一个表格 我们需要从数据库中查询对应的数据,将其汇总进该表格,并且可能还需要复制表格项,我这个案例中没有&a…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
