前言
这是EasyAR应用系列的第二篇,针对AR视频播放,“脱卡”功能是亟待解决的问题。
然而,EasyAR的文档中没有关于iOS原生脱卡的具体实现方式,论坛中提问也没有得到有用的回答。然而,在旧版论坛的请问 iOS 识别好后 播放视频尺寸改变问题中,EasyARSupport给出了视频姿态和尺寸的修改方法,代码由C语言编写。
笔者从该方法中得到启发:
追踪器捕捉到目标图像后,若目标图像脱离摄像头范围时,可以调整视频的姿态和尺寸,使视频仍位于视图的中央并维持原尺寸,脱卡问题就迎刃而解。
实现
- 分析实现原理
根据EasyARSupport提供的代码截图,可以得知代码做了两件事:
- 初始化一个
cameraView
并为其data
属性赋值,其中的下标为12的数值决定了视频的可见范围,为关键参数。 - 为视频渲染提供了一个尺寸,用来规定视频的尺寸比例。
因此,我们可以得出解决方案:在适当的时机调整视频的姿态和尺寸,并实现继续播放视频。
- 寻找适当的时机
在EasyAR示例代码的helloar.m的render()
函数中,targetInstances
为获取到的目标实例,当目标实例的count > 0'即被认为追踪到目标,此时我们进行一系列视频渲染工作;而当其
count > 0`不成立时,我们可以认为目标已脱离摄像头可视范围,此时即为适当的实际。 - 实现脱卡
根据上文中C语言代码是参考,我们可以相应地编写OC实现代码:
if (imagetargetSize != nil) { // 脱卡
// data[12] = 0; 上下位置参数 -0.5(最上), 0(中), 0.5(最下)
NSArray *data = @[@0, @-1, @0, @0, @-1, @0, @0, @0, @0, @0, @1, @0, @0, @0, @-1, @1];
easyar_Matrix44F *cameraView = [easyar_Matrix44F create:data];
easyar_Vec2F *size = [easyar_Vec2F create:@[@1.0f, @1.0f]];
[current_video_renderer render:[camera projectionGL:0.2f farPlane:500.f] cameraview:cameraView size:size];
[video update];
}
其中的imagetargetSize
初始值为nil,并在count > 0
中由[imagetarget size]
的值赋予。其内在逻辑是,imagetargetSize
用于判断目标是否曾被追踪器获取,若未获取,则视频也还不确定,也就不存在调整姿态了。
综述
以上,iOS原生视频视频播放的“脱卡”功能得以实现。
这里有helloar_offcard.m供参考。