01 背景

Live Link Face 可以直接将高品质的面部动画从你的iPhone/iPad实时流送到虚幻引擎UE5中的Metahuman角色上。之前使用过 LivelinkFace 驱动数字人,现在想通过LivelinkFace 驱动人形机器人 Facebot,该如何截胡数据呢?

官网上查不到想用的资料:

通过网上的文档,很难搞清楚数据是通过什么协议传输的?传输的数据格式是怎样的?

02 开始闲得蛋疼

2.1 偶然发现UDP传输

根据 livelinkface 的设置, 默认 target ip: 11111。

随便想想,感觉就是UDP或者TCP。这个是实时推流的应用,而且能同时给多个目标发送,感觉通过 UDP 更加合理。

随便写个python,抓一下数据。(不会专业的抓包工具,用土方法)

1

真的是UDP!!

不光有数据可以被抓到,而且当 livelinkface 捕捉到人脸时的数据和没有捕捉到人脸所推流出来的数据格式(或者说长度)是不一样的。

内心:感觉有戏?

担忧:但是如果在应用层混着什么数据加密算法就没法解码了

2.2 目标转向UE5插件

因为不知道数据的格式,所以没法解码,对我来说只是一堆 0 和 1

继续到网上搜文档。无果。不知道怎么搜,教教我。

想起,UE5中的 metahumen 被驱动时,需要打开 LiveLinkFaceImporter 的插件。能不能找到插件的源码呢?

进入 ...\Program Files\Epic Games\UE_5.3\Engine\Plugins ,通过windows搜索 “LiveLinkFaceImporter“ 的文档,搜不到同名文档,而且很慢。打开 VScode 搜索,还真能找到一些,但是没有太多线索。

顺着这个思路,搜索 blendshape ,跳出一大堆文件。找啊,找啊找

发现一个文件 ...\Program Files\Epic Games\UE_5.3\Engine\Plugins\Runtime\AR\AppleAR\AppleARKitFaceSupport\Source\AppleARKitFaceSupport\Private\AppleARKitLiveLinkSource.h

这个文件很神奇,里面有两个class:

  • FAppleARKitLiveLinkRemoteListener
  • FAppleARKitLiveLinkRemotePublisher

这不就是接受和发送 blendshape 的class嘛,还有socket等等关键词,有戏!继续盘!

03 渐入佳境

3.1 开始研究如何收发blendshape

3.2 数据内容和数据顺序

根据 cpp 里面的逻辑,反复推导,终于得出了组成数据的成分,和各种数据的格式。省略反复推敲的过程,直接将结果整理如下。

3.2.1 数据顺序

3.2.1 数据格式

3.3 深入了解 FQualifiedFrameTime 的格式

https://docs.unrealengine.com/4.26/en-US/API/Runtime/Core/Misc/FQualifiedFrameTime/

D:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\Core\Public\Misc\FrameTime.h

D:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\Core\Public\Misc\QualifiedFrameTime.h

04 写在最后

这次闲得蛋疼的经历,算是成功破解了 LivelinkFace 向 UE5 传输 Blendshape 的数据格式。大概总共用时1小时43分钟。

刚开始破解数据不久,我发现GitHub上有一个老哥 JimWest 已经搞出了一个抓包破解数据的工具 pyLiveLinkFace。这极大加速了我看UE5插件源码的速度,感谢。

JimWest 老哥在代码中备注了

1
2
self._sub_frame = 1056060032                # I don't know how to calculate this
self._denominator = int(self._fps / 60) # 1 most of the time

现在已经可以解释了,这是 FQualifiedFrameTime 中的两部分。具体在 3.3 中已经解释了。

第一次看源码反推,还是很刺激的。而且总感觉网上有 Developer Doc之类的,但我就是找不到。

Anyway,摸鱼结束,到此为止吧~