2018年4月20日-22日,由 infoQ 主办的 Qcon 2018全球软件开发大会在北京如期举行。声网首席 iOS 研发工程师,iOS 端移动应用产品设计和技术架构负责人龚宇华,受邀分享了《基于 ARkit 和 ARcore,在实时视频通话中实现 AR 功能》,在演讲中剖析了 AR 与 VR 差异,ARKit 的工作原理,以及逐步讲解如何基于 ARKit 与声网Agora SDK 创建 AR 视频会议场景。

以下为演讲精华摘录:

首先,龚宇华简要分析了 AR 与 VR 的差别是什么,“VR 是将人置身于一个完全虚拟的场景中,它发展到极致就会像《黑客帝国》一样,你所看到的一切都是虚拟的;AR 则是在现实场景中增加虚拟元素,让两者结合,就像《钢铁侠》电影中的头盔一样,在可以查看周围环境的同时,显示虚拟元素”。不只是在电影中,现实中也有很多AR的应用案例,比如曾火爆一时的游戏 Pocketmon go。

ARKit 如何实现 AR 场景?

在演讲中,龚宇华为大家演示了如何实现一个 AR 视频会议场景,实现效果会与我们在电影《王牌特工》中所看到的场景类似(如下图),特工戴上眼镜之后,世界另一端的特工的虚拟形象就与他坐在同一张桌旁。

“就像我们说把大象放进冰箱里三步骤,我们要打开冰箱,把大象放进去,关上冰箱。那我们实现 AR 的虚拟会议室也是分三步骤,就是实现 AR、实现视频会议,然后把它两个结合起来。”龚宇华表示。最终我们会实现下图中的Demo效果。

目前,苹果和 Google 分别推出了 ARKit 和 ARCore,为我们在移动端实现 AR 场景降低了门槛。实现AR的原理是怎样的呢?我们以 ARKit为例,来看下它是如何工作的。如刚刚所说,AR 就是在实际环境中植入虚拟元素,那么首先要识别出周围环境,也就是通过 iPhone 的摄像头来实现。在手机加速计、陀螺仪的帮助下,ARKit 可以识别3D 的环境并判断手机在环境中的姿态。

通过以上实现过程,我们很容易理解 ARKit 的限制,比如:

  • 光线差:没有足够的光或光线过强的镜面反光。尝试避免这些光线差的环境。

  • 缺少纹理:如果摄像头指向一面白墙,那也没法获得特征,ARKit 也去无法找到并追踪用户。尝试避免看向纯色、反光表面等地方。

  • 快速移动:通常情况下检测和估算 3D 姿态只会借助图片,如果摄像头移动太快图片就会糊,从而导致追踪失败。但 ARKit 会利用视觉惯性里程计,综合图片信息和设备运动传感器来估计用户转向的位置。因此 ARKit 在追踪方面非常强大。

在完成环境识别之后,还需要渲染,通常我们会想到使用 OpenGL 或 Metal 渲染,但是它们的开发成本比较高,所以苹果想了一办法,就是通过 SceneKit 进行渲染。

我们可以通过以下几行代码实现 AR,也就是“将大象关进冰箱”的第一步。

 @IBOutlet weak var sceneView: ARSCNView!override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated)guard ARWorldTrackingConfiguration.isSupported else {return}let configuration = ARWorldTrackingConfiguration()configuration.planeDetection = .horizontalsceneView.session.run(configuration)
}

实现视频通话功能

我们可以通过声网Agora SDK 来快速实现视频通话。在这样的视频通话场景中,声网Agora SDK 具备几个优势:

低延时:声网SDK 实时通讯网络,可实现全球百毫秒级音视频通话;

快速集成:开发者最快可在30分钟内完成集成;

全球化部署:支持全球200多个国家与地区。

在下载最新版声网Agora SDK 后,将其添加到我们的 AR Demo 中。通过以下代码,可以基于 Agora 实现视频会议。

 // 初始化引擎let agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: myAppId,delegate: self)// 设置为发送端agoraKit.setChannelProfile(.liveBroadcasting)agoraKit.setClientRole(.broadcaster)agoraKit.enableVideo()// 加入会议agoraKit.joinChannel(byToken: nil,channelId: “QCon2018”,info: nil,uid: 0,joinSuccess: nil)

将视频通话融入AR场景

在完成视频会议的搭建之后,我们还需要传输本地视频与音频。

let videoSource = ARVideoSource()
agoraKit.setVideoSource(videoSource) 

func session(_ session: ARSession, didUpdate frame: ARFrame) {videoSource.sendBuffer(frame.capturedImage, timestamp: frame.timestamp)
}

1agoraKit.enableExternalAudioSource(withSampleRate: 44100, channelsPerFrame: 1)
1func session(_ session: ARSession, didOutputAudioSampleBuffer audioSampleBuffer: CMSampleBuffer) {
2 agoraKit.pushExternalAudioFrameSampleBuffer(audioSampleBuffer)
3}
最后,当我们通过SDK获得了其它用户发来的音视频数据后,我们还需要将其渲染到AR环境中,实现方式如下。

 class ARVideoRenderer : NSObject, AgoraVideoSinkProtocol {var renderNode: SCNNode!func bufferType() -> AgoraVideoBufferType { return .rawData }func pixelFormat() -> AgoraVideoPixelFormat { return .I420 }func renderRawData(_ rawData: UnsafeMutableRawPointer,size: CGSize,rotation: AgoraVideoRotation) {let rgbTexture = createTexture(widthYUV: rawData, size: size, rotation: rotation)renderNode.geometry?.firstMaterial?.diffuse.contents = rgbTexture}func shouldInitialize() -> Bool { return setupMetal() }func shouldStart() { }func shouldStop() { }func shouldDispose() { }
}

我们曾在之前《基于ARKit与Agora SDK实现AR视频会议》文章中分享了详细的实现步骤,大家也可以访问声网Agora的Githu查看源码。


声网Agora有奖征文活动 正在进行中,只要分享你与声网SDK相关的开发经验博文,即有机会获得Cherry红轴机械键盘、T恤等声网定制奖品。详情请戳这里或微信咨询(ID:dorianz)。

Qcon演讲纪实:详解如何在实时视频通话中实现AR功能相关推荐

  1. linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

  2. 明晚8点公开课 | 用AI给旧时光上色!详解GAN在黑白照片上色中的应用

    在改革开放40周年之际,百度联合新华社推出了一个刷屏级的H5应用--用AI技术为黑白老照片上色,浓浓的怀旧风勾起了心底快被遗忘的时光. 想了解如何给老照片上色?本次公开课中,我们邀请到了百度高级研发工 ...

  3. 公开课 | 用AI给旧时光上色!详解GAN在黑白照片上色中的应用

    在改革开放40周年之际,百度联合新华社推出了一个刷屏级的H5应用--用AI技术为黑白老照片上色,浓浓的怀旧风勾起了心底快被遗忘的时光. 想了解如何给老照片上色?本次公开课中,我们邀请到了百度高级研发工 ...

  4. 详解阿里巴巴1688日常业务中的榜单算法

    导读:本文详解阿里巴巴1688日常业务中的榜单算法. 作者:阿里集团 新零售技术事业群 CBU技术部 来源:大数据DT(ID:hzdashuju) 在1688日常的业务场景中,榜单(如图6-14所示) ...

  5. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  6. HTML中的camera标签,详解HTML5 使用video标签实现选择摄像头功能

    详解HTML5 使用video标签实现选择摄像头功能 1. html // jquery reference // // Open WebCam Snap Photo 2. javascript El ...

  7. 详解使用VueJS开发项目中的兼容问题

    详解使用VueJS开发项目中的兼容问题 本篇文章针对在vue项目中 遇到的兼容性问题以及解决方法做了详细的总结. 一,VUE项目一般会使用axios,而axios又是基于promise的,所以,IE任 ...

  8. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  9. html5 摄像头 直播,详解HTML5 使用video标签实现选择摄像头功能

    详解HTML5 使用video标签实现选择摄像头功能 1. html // jquery reference // // Open WebCam Snap Photo 2. javascript El ...

  10. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

最新文章

  1. Intel深度摄像头RealSense D345(实感双目摄像头)和目标检测结合使用
  2. [专栏目录]-环境搭建安装问题笔记目录
  3. mysql在没有任何用户的情况下,如何恢复
  4. 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
  5. php的数组排列函数,PHP实现的自定义数组排序函数与排序类示例
  6. Define a New Server 没有tomcat选项
  7. Python3的opencv环境搭建简易教程
  8. erlang 变量存储在哪里_[Erlang开发之路]十九、用ets和dets储存数据
  9. 百度网盘下载提速,推荐3种亲测有效的方法
  10. 批量读取word docx文件指定表格内容,保存在excel文件中
  11. 学不会模具设计的原因你知道吗?
  12. Java多线程系列--“JUC锁”03之 公平锁(一) (r)
  13. 罗格斯大学电气与计算机工程专业怎么样,罗格斯大学电气与计算机工程硕士专业...
  14. 热心肠行为?苹果“偷偷“给应用买广告
  15. 准相位匹配二阶频率转换
  16. 木兰天池全新景观2013闪亮登场
  17. 如何提高网站seo排名(关键词排名怎么样优化)
  18. 微信公众平台开发(15)--群发消息
  19. 代码注释生成文档之Doxygen 附说明+下载连接
  20. 企业虚拟服务器管理,中小企业虚拟化解决方案-VMware vSphere 6.5-日常管理入口v0.0.1...

热门文章

  1. python的学习笔记案例1--汇率兑换5.0
  2. 解析李笑来新书《韭菜的自我修养》
  3. ASP微信头像保存到服务器,asp微信小程序获取用户头像和微信名-asp写的服务端...
  4. 《一次与IP MTU、TCP MSS导致SSL协商失败的案例》—那些年踩过的坑(二)
  5. TLS 系统默认版本.NET Framework 3.5.1 Windows 7 SP1 和 Server 2008 R2 SP1 中包含的支持
  6. kazoo在多进程下使用全局连接死锁问题
  7. Java实现微信扫码关注公众号登录网站
  8. MSF给正常程序添加后门
  9. 经营项目计算机、软件及辅助设备、
  10. uv纹理坐标设定与贴图规则