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)。

转载于:https://my.oschina.net/agora/blog/1802035

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. ASP.NET2.0轻松搞定统计图表
  2. 【配置DATAGUARD 时的监听静态注册不成功】 问题解决
  3. oracle中创建一个用户,只能查看指定的视图,如何授权,创建别名
  4. spark streaming性能优化
  5. Keil5消除未调用警告
  6. TensorFlow 1.9.0正式版来了!新手指南全新改版,支持梯度提升树估计器
  7. spring多数据源配置,实现读写分离
  8. 数字孪生数据中心机房,智能 IDC 高阶运维
  9. Android截图指令
  10. 北大公开课计算机,清华、北大、浙大的计算机课程资源集都在这里了
  11. access()函数、_access()函数
  12. 计算机软考证书含金量和性价比分析
  13. ModuleNotFoundError: No module named ‘common‘
  14. ceph radosgw-admin的操作
  15. 全干式光缆与普通光缆的区别
  16. 杰理之IIS总线【篇】
  17. 抖音直播各类话术?开场、留人、促单互动话术合集
  18. K8s(Kubernetes), docker中的registry是什么意思?和windows中的注册表registry有什么区别?
  19. 2500 块外包项目,一款直播引流软件
  20. XP安装SQLSERVER企业版

热门文章

  1. python unpack原理_Python transformers.Unpack方法代码示例
  2. 深圳市已获取支付牌照公司
  3. Android 非功能性测试(性能测试)
  4. alert#40;1#41; to xss.haozi.me with #0x02
  5. CC1310空中升级笔记04 WSN OAD Example
  6. 计算机桌面文件能单独设密码吗,win7文件夹设置密码_给单独一个文件夹设密码...
  7. liunx服务器日志在什么位置,系统日志查看位置(Windows+Linux)
  8. 量价:2 量价基础扫描
  9. PPT怎么画出好看的三维示意图
  10. 古诗词网站源码 php,帝国cms 诗词整站源码