• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當前的位置是:  首頁(yè) > 新聞 > 文章精選 >
     首頁(yè) > 新聞 > 文章精選 >

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

    2018-04-25 11:22:20   作者:   來(lái)源:CTI論壇   評論:0  點(diǎn)擊:


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

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 甘洛县| 江川县| 新泰市| 周至县| 社会| 额尔古纳市| 康保县| 通山县| 漯河市| 宿松县| 秦皇岛市| 平利县| 绩溪县| 陵川县| 淄博市| 宁乡县| 苍溪县| 赤峰市| 安塞县| 灌云县| 延边| 吴桥县| 肥西县| 铁岭县| 晋城| 玛曲县| 达孜县| 青阳县| 英超| 兴仁县| 禹州市| 盐山县| 舞钢市| 西充县| 霍州市| 湘阴县| 玛纳斯县| 连云港市| 景泰县| 全南县| 梁山县| http://444 http://444 http://444 http://444 http://444 http://444