EasyAR应用之iOS原生视频播放【脱卡】

虹藏不见

前言

这是EasyAR应用系列的第二篇,针对AR视频播放,“脱卡”功能是亟待解决的问题。
然而,EasyAR的文档中没有关于iOS原生脱卡的具体实现方式,论坛中提问也没有得到有用的回答。然而,在旧版论坛的请问 iOS 识别好后 播放视频尺寸改变问题中,EasyARSupport给出了视频姿态和尺寸的修改方法,代码由C语言编写。
修改姿态和尺寸
笔者从该方法中得到启发:

追踪器捕捉到目标图像后,若目标图像脱离摄像头范围时,可以调整视频的姿态和尺寸,使视频仍位于视图的中央并维持原尺寸,脱卡问题就迎刃而解。

实现

  • 分析实现原理
    根据EasyARSupport提供的代码截图,可以得知代码做了两件事:
  1. 初始化一个cameraView并为其`data’属性赋值,其中的下标为12的数值决定了视频的可见范围,为关键参数。
  2. 为视频渲染提供了一个尺寸,用来规定视频的尺寸比例。
    因此,我们可以得出解决方案:在适当的时机调整视频的姿态和尺寸,并实现继续播放视频。
  • 寻找适当的时机
    在实例代码的helloar.m的 render()函数中,targetInstances为获取到的目标实例,当目标实例的count > 0'即被认为追踪到目标,此时我们进行一系列视频渲染工作;而当其count > 0`不成立时,我们可以认为目标已脱离摄像头可视范围,此时即为适当的实际。
  • 实现脱卡
    根据上文中C语言代码是参考,我们可以相应地编写OC实现代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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供参考。