背景介绍
需求背景
屏幕共享是视频会议场景使用最广泛的功能之一,在共享一个 PPT 或者文档的情况下,人们对画面清晰度有着极高的要求,“看不清” 是最容易被用户吐槽的事情;而在共享一个视频素材的情况下,大家又对流畅度有着极高的要求,“卡顿” 也是最容易被用户吐槽的点。
为了更好地同时满足用户对清晰度和流畅度的要求,视频会议软件通常会设计两种模式:
-
清晰模式:主打清晰度,尽量保持高分辨率(如:最高 4K 原画质),带宽或性能不足的时候,只降低帧率(如:从 30fps -> 5fps),不降低分辨率。
-
流畅模式:主打流畅度,尽量提升帧率(如:最高 30fps),带宽或性能不足的时候,优先降低分辨率(如:从 4K -> 720p),最后才考虑降帧率。通常情况下,默认选择“清晰模式”,当用户要共享视频的时候,需要自己 “手动” 点击勾选上 “流畅度优先”按钮。
一般的做法是,让用户在共享屏幕时手动来勾选“清晰模式”还是“流畅模式”。但在实际的产品场景中,用户对这两种模式的感知并不是很强烈,不太可能要求用户在共享屏幕的过程中手动来回切换当前的共享模式,对用户体验影响比较大。
一种简单的方案是根据用户共享内容的文件后缀名来决定是“清晰度优先”还是“流畅度优先”,比如共享 PPT 时自动切换为“清晰模式”,共享视频时自动切换为“流畅模式”,但是这样设计会遇到一些问题:比如用户的 PPT 里嵌入了一段视频,在播放这段视频时理应追求“流畅度优先”;而如果用户视频其实是一段 PPT 的教学录屏,里面有大量的时间在播放静止的文字和画面,这时候“流畅模式”则会导致这些关键内容显得模糊。
RTC 要如何帮助用户及时调整最佳的共享模式呢?
需求分析
需求功能分析
痛点:
用户分享视频内容需要高帧率,而文字/ppt 需要高清晰度,这两种场景的需求是互相矛盾的,如果需要用户手动勾选相应的共享模式,不仅操作繁琐,也容易漏选、错选。
如何解决:
需要研发一个算法自动识别共享内容,进而确定当前是需要高帧率还是需要高清晰度。这样,在用户想要清晰画面的时候,产品就提供清晰的画面,用户想要流畅的视频体验时,产品就尽可能地保障屏幕画面的流畅性,用户在无感知的情况下就能获得当前场景的最佳体验。
屏幕共享场景定义
清晰度优先的场景
以文字为主,用户更需要看清楚画面的边缘特征,而较少关注其运动特征。
流畅度优先的场景
以视频内容为主,用户更需要流畅连贯的动态画面,而较少关注于单帧的清晰度。
技术实现
算法原理
学界相关成果概述
目前我们参考了以下两篇参考文献。第一篇是 Jing, Wang & Xuetao, Guan & Yang, Zhang. (2013). An Adaptive Encoding Application Sharing System Based on Remote Display. 266-269. 10.1109/ISDEA.2012.66.
该论文主要假定视频区域的均会以 24-30FPS 的频率发生变化,用 N*N 的 patch 的形式进行检测,从而发现视频区域。
第二篇参考文献是,侯文慧, 王俊峰. 面向云桌面协议的视频区域侦测算法[J]. 计算机应用, 2018, 038(005):1463-1469,1487.
这篇论文主要通过高变化区域侦测,并利用传统 sobel 算子+膨胀算法的边缘检测发现可能的矩形区域,通过颜色直方图的颜色数量判定文本区域从而确定视频内容区域。
相关算法的介绍
1. 光流
光流(Optical flow or optic flow)是空间运动物体在成像平面上的像素运动的瞬时速度,是分析像素运动的一种方法。光流法在模式识别、计算机视觉以及其他图像处理领域中用处广泛,可用于运动检测、图像分割、运动补偿编码和立体视差测量等领域。
(光流示意:https://medium.com/axinc-ai/raft-a-machine-learning-model-for-estimating-optical-flow-6ab6d077e178)
光流法实际是通过检测图像像素点随时间的变化进而推断出物体移动速度及方向的方法。假设该移动很小,那么可以根据泰勒级数得出:
因此可以推出
最终可得出光流方程: