UE自定义分辨率

自定义分辨率是一个经常被问到的问题, 因此单开一节专门进行介绍如何修改视频流的分辨率, 如果你不需要修改你的分辨率, 你可以直接跳过此节.

我会简单介绍平台抓流过程, 随后以UE引擎为例演示分辨率修改方式.

平台抓流

应用运行后, 平台会以应用实际运行的分辨率抓取视频流并传输至前端, 若运行过程中应用分辨率被中途修改, 视频流分辨率也会随之发生改变.

自定义分辨率

由于推流分辨率依赖于应用分辨率, 因此, 只需更改应用分辨率即可.

在UE4中, 对于C++用户:

UKismetSystemLibrary::ExecuteConsoleCommand(this, "r.setRes 1920x1080w", 0);

对应的蓝图节点为: SetRes

但自定义分辨率会受限于机器分辨率, 例如对于2k机器, 其所允许的最大分辨率为1920x1080, 若超过此值, 则分辨率命令将会失效.

你可以利用此功能让应用变成竖屏应用, 也可以适当增加应用分辨率以提升画面清晰度, 也可以适当降低分辨率以节省带宽和降低网络需求.

使用画面裁剪

网页端默认实现了裁剪功能(相对中心裁剪)以保证应用无黑边全屏显示, 如果你要使用裁剪功能, 你应该确保你的应用预留了裁剪空间, 例如, 你的应用在被裁剪边没有紧贴边缘的UI, 否则UI也会一并被裁剪. 保证裁剪余量可以通过UMG的锚点定位轻松实现.

动态分辨率

有些时候, 在设置固定应用分辨率并不能满足业务场景时, 例如, 客户希望应用动态适配前端设备的屏幕百分比而不必进行画面裁剪(UMG系统内置了一套纵横比自适应系统).我们可以基于此前建立的网页端与应用端的网络通信实现动态分辨率.

在网页端, 你可以发送一则消息:

ConsoleCommand:r.setRes 1920x1080w

随后在UE中解析此json并进行拼接即可.

对于C++而言, 可以监听RayvisionSocket组件的OnMessage方法, 随后进行解析:

void YourActor::HandleOnMessage(const FString& Message)
{
  if(Message.StartsWith("ConsoleCommand"))
  {
	  const FString ResCommand = Message.RightChop(Message.Find(":")+1);
	}
}

对应的蓝图节点可以是:

SetRes2

当需要修改分辨率时, 只需要调用前端对应的emit接口即可, 详情请参照前端ray-streaming框架文档.

业务咨询:400-8037-298