亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當(dāng)前的位置是:  首頁 > 新聞 > 文章精選 >
 首頁 > 新聞 > 文章精選 >

聲網(wǎng)龔宇華:詳解如何在實時視頻通話中實現(xiàn)AR功能

2018-04-25 11:22:20   作者:   來源:CTI論壇   評論:0  點擊:


  2018年4月20日-22日,由 infoQ 主辦的 Qcon 2018全球軟件開發(fā)大會在北京如期舉行。聲網(wǎng)首席 iOS 研發(fā)工程師,iOS 端移動應(yīng)用產(chǎn)品設(shè)計和技術(shù)架構(gòu)負(fù)責(zé)人龔宇華,受邀分享了《基于 ARkit 和 ARcore,在實時視頻通話中實現(xiàn) AR 功能》,在演講中剖析了 AR 與 VR 差異,ARKit 的工作原理,以及逐步講解如何基于 ARKit 與聲網(wǎng)Agora SDK 創(chuàng)建 AR 視頻會議場景。
  以下為演講精華摘錄:
  首先,龔宇華簡要分析了 AR 與 VR 的差別是什么,“VR 是將人置身于一個完全虛擬的場景中,它發(fā)展到極致就會像《黑客帝國》一樣,你所看到的一切都是虛擬的;AR 則是在現(xiàn)實場景中增加虛擬元素,讓兩者結(jié)合,就像《鋼鐵俠》電影中的頭盔一樣,在可以查看周圍環(huán)境的同時,顯示虛擬元素”。不只是在電影中,現(xiàn)實中也有很多AR的應(yīng)用案例,比如曾火爆一時的游戲 Pocketmon go。
  ARKit 如何實現(xiàn) AR 場景?
  在演講中,龔宇華為大家演示了如何實現(xiàn)一個 AR 視頻會議場景,實現(xiàn)效果會與我們在電影《王牌特工》中所看到的場景類似,特工戴上眼鏡之后,世界另一端的特工的虛擬形象就與他坐在同一張桌旁。
  “就像我們說把大象放進(jìn)冰箱里三步驟,我們要打開冰箱,把大象放進(jìn)去,關(guān)上冰箱。那我們實現(xiàn) AR 的虛擬會議室也是分三步驟,就是實現(xiàn) AR、實現(xiàn)視頻會議,然后把它兩個結(jié)合起來。”龔宇華表示。
  目前,蘋果和 Google 分別推出了 ARKit 和 ARCore,為我們在移動端實現(xiàn) AR 場景降低了門檻。實現(xiàn)AR的原理是怎樣的呢?我們以 ARKit為例,來看下它是如何工作的。如剛剛所說,AR 就是在實際環(huán)境中植入虛擬元素,那么首先要識別出周圍環(huán)境,也就是通過 iPhone 的攝像頭來實現(xiàn)。在手機加速計、陀螺儀的幫助下,ARKit 可以識別3D 的環(huán)境并判斷手機在環(huán)境中的姿態(tài)。
  通過以上實現(xiàn)過程,我們很容易理解 ARKit 的限制,比如:
  • 光線差:沒有足夠的光或光線過強的鏡面反光。嘗試避免這些光線差的環(huán)境。
  • 缺少紋理:如果攝像頭指向一面白墻,那也沒法獲得特征,ARKit 也去無法找到并追蹤用戶。嘗試避免看向純色、反光表面等地方。
  • 快速移動:通常情況下檢測和估算 3D 姿態(tài)只會借助圖片,如果攝像頭移動太快圖片就會糊,從而導(dǎo)致追蹤失敗。但 ARKit 會利用視覺慣性里程計,綜合圖片信息和設(shè)備運動傳感器來估計用戶轉(zhuǎn)向的位置。因此 ARKit 在追蹤方面非常強大。
  在完成環(huán)境識別之后,還需要渲染,通常我們會想到使用 OpenGL 或 Metal 渲染,但是它們的開發(fā)成本比較高,所以蘋果想了一辦法,就是通過 SceneKit 進(jìn)行渲染。
  我們可以通過以下幾行代碼實現(xiàn) AR,也就是“將大象關(guān)進(jìn)冰箱”的第一步。
  1. @IBOutlet weak var sceneView: ARSCNView!
  2. override func viewDidAppear(_ animated: Bool) {
  3. super.viewDidAppear(animated)
  4. guard ARWorldTrackingConfiguration.isSupported else {
  5. return
  6. }
  7. let configuration = ARWorldTrackingConfiguration()
  8. configuration.planeDetection = .horizontal
  9. sceneView.session.run(configuration)
  10. }
  實現(xiàn)視頻通話功能
  我們可以通過聲網(wǎng)Agora SDK 來快速實現(xiàn)視頻通話。在這樣的視頻通話場景中,聲網(wǎng)Agora SDK 具備幾個優(yōu)勢:
  • 低延時:聲網(wǎng)SDK 實時通訊網(wǎng)絡(luò),可實現(xiàn)全球百毫秒級音視頻通話;
  • 快速集成:開發(fā)者最快可在30分鐘內(nèi)完成集成;
  • 全球化部署:支持全球200多個國家與地區(qū)。
  在下載最新版聲網(wǎng)Agora SDK 后,將其添加到我們的 AR Demo 中。通過以下代碼,可以基于 Agora 實現(xiàn)視頻會議。
  1// 初始化引擎
  2let agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: myAppId,
  3                                              delegate: self)
  4// 設(shè)置為發(fā)送端
  5agoraKit.setChannelProfile(.liveBroadcasting)
  6agoraKit.setClientRole(.broadcaster)
  7agoraKit.enableVideo()
  8// 加入會議
  9agoraKit.joinChannel(byToken: nil,
  10                     channelId: “QCon2018”,
  11                     info: nil,
  12                     uid: 0,
  13                     joinSuccess: nil)
  將視頻通話融入AR場景
  在完成視頻會議的搭建之后,我們還需要傳輸本地視頻與音頻。
  1let videoSource = ARVideoSource()
  2agoraKit.setVideoSource(videoSource)
  1func session(_ session: ARSession, didUpdate frame: ARFrame) {
  2    videoSource.sendBuffer(frame.capturedImage, timestamp: frame.timestamp)
  3}
  1agoraKit.enableExternalAudioSource(withSampleRate: 44100, channelsPerFrame: 1)
  1func session(_ session: ARSession, didOutputAudioSampleBuffer audioSampleBuffer: CMSampleBuffer) {
  2    agoraKit.pushExternalAudioFrameSampleBuffer(audioSampleBuffer)
  3}
  最后,當(dāng)我們通過SDK獲得了其它用戶發(fā)來的音視頻數(shù)據(jù)后,我們還需要將其渲染到AR環(huán)境中,實現(xiàn)方式如下。
  1class ARVideoRenderer : NSObject, AgoraVideoSinkProtocol {
  2    var renderNode: SCNNode!
  3    func bufferType() -> AgoraVideoBufferType { return .rawData }
  4    func pixelFormat() -> AgoraVideoPixelFormat { return .I420 }
  5    func renderRawData(_ rawData: UnsafeMutableRawPointer,
  6                       size: CGSize,
  7                       rotation: AgoraVideoRotation) {
  8        let rgbTexture = createTexture(widthYUV: rawData, size: size, rotation: rotation)
  9        renderNode.geometry?.firstMaterial?.diffuse.contents = rgbTexture
  10    }
  11    func shouldInitialize() -> Bool { return setupMetal() }
  12    func shouldStart() { }
  13    func shouldStop() { }
  14    func shouldDispose() { }
  15}
  我們曾在之前《基于ARKit與Agora SDK實現(xiàn)AR視頻會議》文章中分享了詳細(xì)的實現(xiàn)步驟,大家也可以訪問「閱讀原文」查看源碼。
  聲網(wǎng)Agora 有獎?wù)魑幕顒?正在進(jìn)行中,只要在5月25日前分享你與聲網(wǎng)Agora SDK 相關(guān)的開發(fā)經(jīng)驗,即有機會獲得機械鍵盤、T恤等聲網(wǎng)定制獎品。報名與活動咨詢,關(guān)注微信公眾號后臺留言。點擊圖片了解更多活動詳情。
 
【免責(zé)聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題

仁怀市| 新龙县| 民乐县| 宝兴县| 濉溪县| 桃园县| 武穴市| 隆化县| 肇东市| 屯门区| 阜宁县| 伊川县| 民县| 玛曲县| 仙桃市| 昌吉市| 梧州市| 梅河口市| 扶沟县| 威信县| 德昌县| 新田县| 兴隆县| 罗甸县| 陆丰市| 温宿县| 金川县| 新平| 贡山| 贵港市| 三台县| 宣汉县| 沙雅县| 长治县| 磐石市| 木里| 麦盖提县| 临潭县| 林西县| 周至县| 苍山县|